(基础)java中对象的创造过程

(基础)java中对象的创建过程

Java中创建一个对象,要经历哪些过程?

以子类,父类为例,当创建子类对象时,将会发生什么?

 

public class Parent {
	Parent() {
		//子类构造函数调用父类构造函数,导致父类构造函数中的this指向子类对象
		this.show();
		System.out.println("Parent\t"+this);
	}
	
	void show() {
		System.out.println("Parent.show()");
	}
}

 

public class Child extends Parent {
	int num = 100;
	
	Child() {
                //此时num=0
		//super();
		//调用完父类的构造函数之后,子类才开始显示初始化,此时num才等于100
		System.out.println("Child\t"+this);
		//return;
	}
	
	void show() {
		System.out.println("Child.show()\t"+num);
	}
}

 

public class Test {
	public static void main(String[] args) {

		Child zi = new Child();
		zi.show();
	}
	
}

 

程序运行结果及说明:

Child.show()    0
Parent    Child@6bcf8de2
Child    Child@6bcf8de2
Child.show()    100

 

程序执行过程
1.new 将在堆内存开辟空间,并把Child的成员变量num放到堆内存中,此时num=0
2.调用Parent类的子类构造函数
3.由于子类构造函数中默认存在一个super(),将调用父类Parent的构造函数
4.父类构造函数持有的this,指向的子类对象,调用子类对象的show(),由于此时子类对象的成员变量num尚未初始化(子类构造函数还未执行到对变量进行赋值操作),所以num的值是默认初始值0
5.父类构造函数执行完成后,子类开始继续执行构造函数,对堆内存中的变量进行显示初始化
6.最后,num=100

 

 

 

 

 一个更经典的例子

 

public class Parent {
	public  Parent() {
		System.out.println("Parent constructor run");
		//将调用子类复写的method()
		this.method();
	}
	
	void method() {
		System.out.println("Parent.method()");
	}
}

 

public class Child extends Parent{
	String name;
	int age = 10;//显示初始化
	
	{
		//先super(),再显示初始化,再调用构造代码块
		System.out.println("构造代码块, name="+name+",age="+age);
		age = 20;
	}
	
	public Child(String name) {
		//name=null,age=0
		super();
		//--->进行显示初始化,name=null,age=10
		//--->执行构造代码块,name=null,age=20
		this.name = name;//最后进行构造函数入参对成员变量进行初始化,name="",age=20
		System.out.println("Child constructor over, name="+name+",age="+age);
	}
	
	public void method() {
		System.out.println("Child.method(), name="+name+",age="+age);
	}
}

 

 

public class Test {
	public static void main(String[] args) {
		new Child("莉莉");
	}
	
}

 运行结果:

Parent constructor run
Child.method(), name=null,age=0
构造代码块, name=null,age=10
Child constructor over, name=莉莉,age=20