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

原文地址:https://www.cnblogs.com/kkkky/p/6383641.html