首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2013-10-11 
(基础)java中对象的创建过程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才等于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

热点排行