JAVA子类继承-子类的实例化过程

一个对象的实例化过程

Person p = new Person();

1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下).
2,在堆内存中开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先调用父类中构造函数进行初始化。
6,父类初始化完毕后,再对子类的属性进行显示初始化。
7,进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量Person p.

面试例子

class Fu
{
    Fu(){
        super();
         //通过结果可以看出,子父类有同名show方法,调用的是子类show方法。
         //这里有一个默认的this, 因为是子类调用的这个构造器,所以this的对象
         //所以调用的是子类的方法.
        show(); 
        return;
    }
    void show() {
        System.out.println("fu show");
    }
}
class Zi extends Fu
{
    int num = 8;
    Zi()
    {
        super();
        //-->通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后,
        //才进行子类的成员变量显示初始化。

        System.out.println("zi cons run...."+num);
        return;
    }
    void show() 
    {
        System.out.println("zi show..."+num);
    }
}
class ExtendsDemo5 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi(); 
        z.show();
    }
}

运行结果:zi show…0
zi cons run…8
zi show…8

总结:当满足下面条件时

  1. 子类和父类有同名同参数的方法
  2. 父类的构造器中调用了这个方法
  3. 此时实例化子类的时候,调用父类的构造器,之后调用其中的方法,就会调用子 类的方法.

子父类中同名变量问题

class Fu {
    private int num = 4;
 
    public int getNum() {
        return num;
    }
}
class Zi extends Fu {
    private int num = 5;
 
    void show() {
        System.out.println(this.num + "....." + super.getNum());
    }
}
class ExtendsDemo1 {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}

输出结果:
5…4

你可能感兴趣的:(JAVASE)