Java继承--子类的实例化过程
一个对象的实例化过程:
Person p = new Person();
1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下).
2,在堆内存中开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先调用父类中构造函数进行初始化。
6,父类初始化完毕后,再对子类的属性进行显示初始化。
7,进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量Person p.
例:(面试,一个很说明问题的例子)
1 class Fu 2 { 3 Fu() 4 { 5 super(); 6 show(); //通过结果可以看出,子父类有同名show方法,调用的是子类show方法。 7 return; 8 } 9 10 void show() 11 { 12 System.out.println("fu show"); 13 } 14 } 15 class Zi extends Fu 16 { 17 int num = 8; 18 Zi() 19 { 20 super(); 21 //-->通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后, 22 //才进行子类的成员变量显示初始化。 23 24 System.out.println("zi cons run...."+num); 25 return; 26 } 27 void show() 28 { 29 System.out.println("zi show..."+num); 30 } 31 } 32 class ExtendsDemo5 33 { 34 public static void main(String[] args) 35 { 36 Zi z = new Zi(); 37 z.show(); 38 } 39 }
运行结果:
zi show...0
zi cons run....8
zi show...8
子父类中同名变量问题(面试)
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