一张图片带给我的探索

一张图片带给我的探索_第1张图片

刚接触这道题的时候我还在adcd选项中犹豫不决,经过一番查阅资料终于攻克了这道题。

要想成功解决这道题要知道2点

  1. 当new Derived()时,会先执行父类的构造方法,然后再去调用子

    类中的构造方法;

  2. 动态链接: 因为Base是父类,因此Derived对象的引用是可以指向父

    类的(向上转型)。当父类定义的方法,在没有被子类重写的情况下,

才可以被父类调用。如果父类定义的方法,被子类重写了,那么父类将会

去被子类中的方法而不是父类。

 因为new Derived(),所以将会先去执行父类的构造方法,然后再去

调用子类的构造方法。在执行父类的构造方法时,因为子类重写

addValued(),所以会执行子类中的 value+=20;当再去执行子类的构造方法

结束后,value=40;

总结:

  1. 使用父类类型的引用指向子类的对象;
  2. 该引用只能引用父类中定义的方法和变量,如果要调用父类中没有定义的,或者在子类中被重载的方法,需要向上转型(Derived)base;
  3. 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;

    源码:

    public class Base {

    int value=0;

    Base(){
        System.out.println(value+"父类构造方法1");
        addValue();
        System.out.println(value+"父类构造方法2");
    }
    
    void addValue(){
        System.out.println(value+"父类的add1");
        value+=10;
        System.out.println(value+"父类的add2");
    
    }
    
    int getValue(){
        return value;
    }
    

}

public class Derived extends Base{


    String bt="确定";

    String adc;

    Derived(){
        System.out.println(value+"子类的构造 1");
        addValue();
        System.out.println(value+"子类的构造 2");
    }

    void addValue(){
        System.out.println(value+"子类的add1");
        value+=20;
        System.out.println(value+"子类的add2");
    }

    void addValue(String c){
        this.adc=c;
        System.out.println("adc:"+adc);
    }
}

public class Test {

public static void main(String[] args) {

    Base base=new Derived();
    System.out.println(base.getValue());
    Derived derived=(Derived)base;
    derived.addValue("thank");
    System.out.println(derived.bt);



}

}

日志:
    0父类构造方法1
    0子类的add1
    20子类的add2
    20父类构造方法2
    20子类的构造 1
    20子类的add1
    40子类的add2
    40子类的构造 2
    40
    adc:thank
    确定

你可能感兴趣的:(一张图片带给我的探索)