zoukankan      html  css  js  c++  java
  • java中的多重继承

    “一个x是一个a和一个b以及一个c”

    对于这句话的理解,在java代码中可以这样写:

    interface AInterface {
    public void aMethod();
    }

    interface BInterface {
    public void bMethod();
    }

    class FatherClass {
    public void cMethod() {
    System.out.println("cMehtod");
    }
    }

    public class TestInterfaces extends FatherClass implements AInterface, BInterface {
    @Override
    public void aMethod() {
    System.out.println("aMehtod");
    }

    @Override
    public void bMethod() {
    System.out.println("bMehtod");
    }

    @Override
    public void cMethod() {
    super.cMethod();
    System.out.println("sub cMehtod");
    }

    public static void main(String[] args) {
    TestInterfaces ti = new TestInterfaces();
    AInterface aClass = (AInterface)ti;
    aClass.aMethod();
    //aClass.bMethod(); error
    //aClass.cMethod(); error

    BInterface bClass = (BInterface)ti;
    //bClass.aMethod(); error
    bClass.bMethod();
    //bClass.cMethod(); error

    FatherClass fc = (FatherClass)ti;
    //fc.aMethod(); error
    //fc.bMethod(); error
    fc.cMethod();
    }
    }


    在main方法中可以看出,TestInfterfaces类可以向上转型为AInterface或者BInterface或者FatherClass,但是向上转型后,其它接口实现方法或者父类的覆载方法都无法调用了,这也恰好说明了向上转型的特性!

    如果TestInfterfaces类继承的多个接口中有重复的方法定义,那么在TestInfterfaces类中只需实现一次即可。在做向上转型,也会同时拥有该方法的实现。

    interface AInterface {
    public void aMethod();
    public void print();
    }

    interface BInterface {
    public void bMethod();
    public void print();
    }

    class FatherClass {
    public void cMethod() {
    System.out.println("cMehtod");
    }
    }

    public class TestInterfaces extends FatherClass implements AInterface, BInterface {
    @Override
    public void aMethod() {
    System.out.println("aMehtod");
    }

    @Override
    public void bMethod() {
    System.out.println("bMehtod");
    }

    @Override
    public void print() {
    System.out.println("print method");
    }

    @Override
    public void cMethod() {
    super.cMethod();
    System.out.println("sub cMehtod");
    }

    public static void main(String[] args) {
    TestInterfaces ti = new TestInterfaces();
    AInterface aClass = (AInterface)ti;
    aClass.aMethod();
    //aClass.bMethod(); error
    //aClass.cMethod(); error
    aClass.print(); //right

    BInterface bClass = (BInterface)ti;
    //bClass.aMethod(); error
    bClass.bMethod();
    //bClass.cMethod(); error
    bClass.print(); //right

    FatherClass fc = (FatherClass)ti;
    //fc.aMethod(); error
    //fc.bMethod(); error
    fc.cMethod();
    //fc.print(); error
    }
    }

    如果重载父类的方法在继承的接口中有定义,即

    interface BInterface {
    public void bMethod();
    public void print();
    }

    class FatherClass {
    public void cMethod() {
    System.out.println("cMehtod");
    }

    public void print() {
    System.out.println("FatherClass print");
    }
    }

    那么在TestInfterfaces类中,可以不覆载print方法

    public class TestInterfaces extends FatherClass implements AInterface, BInterface {
    @Override
    public void aMethod() {
    System.out.println("aMehtod");
    }

    @Override
    public void bMethod() {
    System.out.println("bMehtod");
    }

    // @Override
    // public void print() {
    // System.out.println("print method");
    // }

    @Override
    public void cMethod() {
    super.cMethod();
    System.out.println("sub cMehtod");
    }

    public static void main(String[] args) {
    TestInterfaces ti = new TestInterfaces();
    AInterface aClass = (AInterface)ti;
    aClass.aMethod();
    //aClass.bMethod(); error
    //aClass.cMethod(); error

    BInterface bClass = (BInterface)ti;
    //bClass.aMethod(); error
    bClass.bMethod();
    //bClass.cMethod(); error
    bClass.print(); //right

    FatherClass fc = (FatherClass)ti;
    //fc.aMethod(); error
    //fc.bMethod(); error
    fc.cMethod();
    fc.print();
    }
    }

    虽然没有显示提供print方法的定义,但编译正确。原因是print方法在FatherClass类中继承而来,自动提供了print方法的定义。

    如果重载父类中的一个方法名与继承的接口中定义的一个方法名相同,但返回值类型不同,即

    interface BInterface {
    public void bMethod();
    public int print();
    }

    class FatherClass {
    public void cMethod() {
    System.out.println("cMehtod");
    }

    public void print() {
    System.out.println("FatherClass print");
    }
    }

    那么在TestInfterfaces类中就会出现错误,无法编译。

    因此,在多重继承中,尽量避免上述情况!






  • 相关阅读:
    (转)基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
    (转)基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
    (转)基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度
    心得体悟帖---200301(因为别人或者别的事情,影响自己的心情,实在是太傻b了)
    心得体悟帖---200301(尽量把课程弄短,那样不良状态也可以录课)
    范仁义js课程---34、break和continue
    尚硅谷js---44、break和continue
    javascript疑难问题---5、javascript代码执行时间的计算
    范仁义js课程---33、打印99乘法表
    范仁义js课程---32、for循环嵌套
  • 原文地址:https://www.cnblogs.com/linxyz/p/2397082.html
Copyright © 2011-2022 走看看