java中继承关系总结

来源:互联网 发布:美国对中国的误解知乎 编辑:程序博客网 时间:2024/05/22 08:09

继承中的注意事项
1.子类重写父类中的方法,可以扩大修饰范围,但不能缩小修饰范围
如:

class Base {public Base (){ //...     }public Base ( int m ){ //...    }protected void fun( int n ){    //... }public class Child extends Base{// member methods编译通过//  public void fun ( int n ) {//      //... }//  }编译不通过    private void fun( int n ){         //...}    }}

1.直接先看代码案列

/父类package com.imooc;public class Cleanser {    private String s = new String("Cleanser");    public void append(String a) { s += a; }    public void dilute() { append(" dilute()"); }    public void apply() { append(" apply()"); }    public void scrub() { append(" scrub()"); }    public void print() { System.out.println(s); }  //子类package com.imooc;public class Detergent extends Cleanser {    @Override    public void scrub() {        append(" Detergent.scrub()");    //  super.scrub(); // Call base-class version        }    public void foam() { append(" foam()"); }}//子类1public class Detergent2 extends Cleanser {    @Override    public void scrub() {        append(" Detergent2.scrub()");    //  super.scrub(); // Call base-class version        }    public void foam() { append(" foam2()"); }}   public static void main(String[] args) {    Cleanser x = new Cleanser();    x.dilute(); x.apply(); x.scrub();    x.print();    }}

测试类:创建一个带有继承关系的对象

//测试类1public class testCleanser {    @Test    public void test() {        Cleanser x = new Detergent();   //x为父类对象并派生出特有子类,不能直接调用子类的方法,x为向上转型//      x.dilute();//      x.apply();        x.scrub();  //默认调用的是子类重写后的方法        ((Detergent) x).foam();//运行不报错        x.print();        System.out.println("Testing base class:");    //   Cleanser.main(args);    }//测试类1-1public class testCleanser {    @Test    public void test() {        //x为父类对象并派生出特有子类,不能直接调用子类的方法        Cleanser x=new Detergent2();        //x1为父类对象并派生出特有子类,不能直接调用子类的方法        Cleanser x1=new Detergent();        x.dilute();//      x.apply();        x.scrub();        x1.scrub();        ((Detergent2) x).foam();        ((Detergent) x1).foam();        x.print();        System.out.println("-----------");        x1.print();        System.out.println("Testing base class:");    //   Cleanser.main(args);    }

输出为:

Cleanser dilute() Detergent2.scrub() foam2()-----------Cleanser Detergent.scrub() foam()Testing base class:

是不是感觉就如接口中的一个接口对应着不同的实现类,分别调用重写后的方法,只不过接口中的方法都是抽象方法罢了。
在来看一下:
直接new一个子类对象

/测试类2public class testCleanser {    @Test    public void test() {        Detergent x = new Detergent();//x为子类对象,可以直接调用父类的(非私有)方法        x.dilute();//      x.apply();        x.scrub();//      ((Detergent) x).foam();        x.print();        System.out.println("Testing base class:");    //   Cleanser.main(args);    }}

直接new一个父类对象

//测试类3public class testCleanser {    @Test    public void test() {        Cleanser x=new Cleanser();//x为父类对象,不能调用子类的方法        x.dilute();//      x.apply();        x.scrub();        ((Detergent) x).foam();//运行报错,java.lang.ClassCastException: com.imooc.Cleanser cannot be cast to com.imooc.Detergent        x.print();        System.out.println("Testing base class:");    //   Cleanser.main(args);    }}

以上是我的部分个人总结,博主还将继续完善,请大家多多支持

1 0
原创粉丝点击