(基础)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才等于100System.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=0super();//--->进行显示初始化,name=null,age=10//--->执行构造代码块,name=null,age=20this.name = name;//最后进行构造函数入参对成员变量进行初始化,name="",age=20System.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