对象的创建过程,子父类中构造函数特点

对象的创建过程

类的加载过程:

  1. 启动JVM,加载程序中需要使用的class文件。
  2. 在加载class文件的时候,所有的静态内容(静态成员变量,静态成员函数,静态代码块)都要加载到方法区的静态区中。
  3. 当类中的所有静态加载完成之后,开始给类中的所有静态成员变量默认初始化。
  4. 类中的所有静态成员变量默认初始化完成之后,开始给这些静态成员变量显示赋值。
  5. 所有静态成员变量显示赋值结束之后,开始运行类中的静态代码块
  6. 当所有的静态代码块执行完成,代表当前这个class文件才彻底被加载结束。

 

对象的创建过程:

  1. 使用new关键字创建对象,在堆给对象分配内存空间
  2. 给对象所属类中的所有非静态成员变量分配空间并进行默认的初始化
  3. 执行和new对象时传递参数一致的构造函数。
  4. 执行构造函数的的过程中有隐式的三步:

         4.1、执行super() 语句,找父类的空参数构造函数

         4.2、给成员变量进行显示赋值。

          4.3、构造代码块运行

          4.4、构造函数中的自己写的代码执行。

     5、构造函数执行完成,对象创建结束。

 

子父类中构造函数特点

 

在前面学习对象的创建流程中,在使用new关键字创建对象的时候,先在堆中给对象分配内存空间,接着给非静态的成员变量进行默认初始化,开始调用对应的构造函数。而在执行构造函数中有隐式的三步:

  1. super(); 它是在调用自己的父类空参数的构造函数。
  2. 成员变量显示赋值
  3. 构造代码块运行

4、本构造函数中的代码运行。

 

class Fu{

    int x = 3;

    {

       System.out.println("Fu 构造代码块执行...x="+x);

    }

    Fu(){

       System.out.println("Fu构造函数执行");

       show();

    }

    public void show(){

       System.out.println("Fu show...x="+x);

    }

}

class Zi extends Fu{

    int y = 10;

    {

       System.out.println("Zi 构造代码块执行...x="+x);

       System.out.println("Zi 构造代码块执行...y="+y);

    }

    Zi(){

       System.out.println("Zi 构造函数执行...");

       show();

    }

    public void show(){

       System.out.println("Zi show...x="+x);

       System.out.println("Zi show...y="+y);

    }

}

public class Demo {

    public static void main(String[] args) {

       Zi z = new Zi();

    }

}

 

1.9、子类的实例化过程

 

1、为什么任何一个类(不包含Object)的构造函数中需要一个隐式的super() 语句?

因为任何的子类在继承了父类之后,都会继承到父类的成员变量,这时在创建子类对象的时候,会在子类的对象空间中分配出空间存储父类的成员变量。而父类的成员变量初始化动作必须由父类的自己的构造函数完成。所以在任何类的构造函数中有一个隐式的super()语句。

 

2、如果一个类中的所有构造函数全部私有了,问还可以有子类吗?子类能实例化吗?

一个类的构造函数全部私有,这时这个类是无法再有子类的。就不存在实例化问题。

 

3、如果一个类没有空参数的构造函数,问这个类可以有子类吗?子类可以实例化吗?

如果这个类还有其他的构造函数可以被访问,那么这个类就可以有子类

这是要求在子类的构造函数中必须手动的书写super语句,同时在super( 具体的参数 )。根据指定的参数去调用父类类型相同的构造函数

 

4、this调用构造函数可以和super调用父类构造函数共存吗?

不可以。因为this和super调用构造函数都必须在构造函数中的第一行。

this是调用本类其他构造函数对当前这个对象初始化,而super是调用父类构造函数进行初始化,而初始化动作在一个构造函数中只能有一个。

在一个类中有多个构造函数,之间可以使用this调用,但不能形成嵌套调用。最后肯定有一个构造函数中是没有this调用的,最后它中必然会有super语句调用父类的构造函数。

 

猜你喜欢

转载自blog.csdn.net/M_Jack/article/details/84113121