一、过程
Person p = new Person();
1,JVM会去读取指定路径下的Person.class文件,并加载进内存,
并会先加载Person的父类(如果有直接父类的情况下)
2,在堆内存中开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化
4,调用对应的构造函数,进行初始化
5,在构造函数中,第一行会先调用父类中的构造函数进行初始化。
6,父类初始化完毕后,再对子类的属性,进行显示初始化。
7,指定构造函数的特定初始化
8,初始化完毕后,将堆内存中的地址值赋给引用变量。
即:过程为:
子类属性默认初始化==》父类构造函数初始化==》子类属性显示初始化!!!
二、特点:
在子类构造对象时,发现,访问子类构造函数时,父类也运行了。
一】具体:
在子类的构造函数中第一行有一个默认的隐式语句。 super();
但是,当自己在子类构造函数中写了一个super的构造语句,则就不会自动调用了。
注意:当父类中构造函数为Fu(int x)时,
子类中则必须用super(6);否则报错!
子类的实例化过程中:
子类中所有的构造函数默认都会访问父类中的空参数构造函数。
二】【重点】为什么子类实例化的时候要访问父类中的构造函数?
1》子类继承了父类,获取到了父类中的内容(属性),所以在使用父类内容之前
要先看父类是如何对自己的内容进行初始化的。
所以子类在构造对象时,就必须访问父类中的构造函数,因此要在子类的构造函数中加入super语句。
2》如果父类中没有定义空构造函数,那么子类的构造函数必须用super明确调用父类中对应的构造函数
3》子类构造函数中如果使用this调用了本类构造函数时,则调用this的这个构造函数中super便没有了,
因为super和this都只能定义在第一行。
但是可以保证的是,子类中肯定会有其它的构造函数访问父类的构造函数。
注:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
注:java所有的类都是Objiect的子类。
相关文章
- 学习effective java-4创建和销毁对象之利用私用构造方法强化类的非实例化
- java对象实例化过程中的代码执行顺序
- Path.Data样式仅适用于样式化对象的第一个实例
- Java判断一个对象是否为指定类的实例
- 如何从Powershell访问正在运行的Internet Explorer实例的经典Internet Explorer COM自动化对象?
- 是否有可能创建一个只能作为另一个类的成员实例化的类,但仍然可以通过VB.NET中的公共访问?
- JVM_07 运行时数据区4-对象的实例化内存布局与访问定位+直接内存
- 想请问下,new 实例化对象的时候,是放在程序外部好还是内部好?哪种更节省内存开销
- 互斥对象(Mutex)、事件对象(Event) 与 关键代码段(CriticalSection) 的比较(互斥量Mutex 保证只有一个实例运行)
- JVM 专题十二:运行时数据区(七)对象的实例化内存布局与访问定位