(基础)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