子父类中的构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子父类中的构造函数相关的知识,希望对你有一定的参考价值。

首先了解构造函数

构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。即为对象成员变量赋初始值。

构造函数与类名相同,可重载多个不同的构造函数。如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造方法,这个构造方法不执行任何代码。

构造函数的调用

(1)子类只调用父类的默认(缺省)构造函数,即无形参构造函数。如果父类没有默认构造函数,那子类不能从父类调用默认构造函数。
(2)子类从父类处调用父类默认构造函数,不能成为子类的默认构造函数。
(3)在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。
(4)如果子类想调用父类的非默认构造函数,则必须使用super来实现。
(5)子类必须调用父类的构造函数。可以通过系统自动调用父类的默认构造函数,如果父类没有默认构造函数时,子类构造函数必须通过super调用父类的构造函数。
 
java 构造函数的执行过程
类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)调用父类构造函数;
(3)按顺序分别调用类成员变量和实例成员变量的初始化表达式
class Dollar {
Money m = new Money();
Rmb r = new Rmb();
public Dollar() {
System.out.println("Dollar is constructor.");
}
public static void main(String[] args) {
new Dollar();
}
}
class Money {
public Money() {
System.out.println("Money is constructor.");
}
}
class Rmb {
public Rmb() {
System.out.println("RMB is constructor.");
}
}
输出结果:
Money is constructor.
RMB is constructor.
Dollar is constructor.
 

子父类中的构造函数的特点:

  在子类构造对象时,发现,访问子类构造函数时,父类也运行了。

为什么会这样呢?

  原因是:在子类的构造函数中第一行有一个默认的隐式语句。super();

子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。

为什么子类实例化的时候要访问父类的构造函数呢?

  那是因为子类继承了父类,获取了父类中的内容(属性),所以在使用父类内容之前,首先要看父类如何对自己的内容进行初始化的。

  所以子类在构造对象时,必须访问父类中的构造函数。为了完成这个必须的动作就在子类的构造函数中加入了super语句。如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用哪个构造函数(通过super的参数)。

注意:super语句必须要定义在子类构造函数的第一行,因为父类的初始化动作必须要先完成。

通过super关键字初始化父类内容时,子类的成员变量并未显示初始化。等supe()父类初始化完毕后,才进行子类的成员变量显示初始化。

 

一个对象的实例化过程:

  Person p = new Person ();

1、JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接父类的情况下Object不算)

2、在堆内存中开辟空间,分配地址

3、并在对象空间中,对对象的属性进行默认初始化

4、调用对应的构造函数进行初始化

5、在构造函数中,第一行会先到父类中的构造函数进行初始化

6、父类初始化完毕后,在对子类的属性进行显示初始化

7、在进行子类构造函数的特定初始化

8、初始化完毕后,将地址赋值给引用变量  

 

以上是关于子父类中的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

子父类中的构造函数

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节

子父类构造函数特点

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-内存图解

继承&构造函数

java基础-子父类中的成员变量