对象实例化过程

对象实例化过程:

    1.首先分析一下内存空间

  •     堆空间(Heap) : 使用new来开辟的堆内存空间,储存对象
  •     栈空间(Stack) :用来储存一些变量的,基础数据类型、对象的引用(对象堆空间地址)

                                      栈存取速度比堆要快,仅次于直接位于CPU中的寄存器

  •     方法区(Methd) :线程共享区域,储存类信息,常量,静态变量,即时编译器编译后的代码等数据

   2.对象实例化:

     (1)首先,静态代码块在加载时就执行了,所以肯定是最先执行的;

     (2)对于非静态代码块会在构造方法中的代码块之前加载

                    运行结果:       

           static成员在加载字节码文件到内存过程是会被优先执行,静态成员变量会在方法区优先初始化

      (3)具体过程:

         

     (4)若存在继承关系:

 继承的过程:在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间,并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序;若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

        所以加载顺序为:

        父类静态代码块->子类静态代码块->父类非静态代码块->父类构造函数->

       子类非静态代码块->子类构造函数

     遵循规则

  •      静态代码块->普通代码块->构造方法
  •     先父类后子类 
  •     先静态后非静态  

                       

3.补充:

   jvm 加载类进内存时,会先加载父类,然后加载子类

  在初始化类时,先对类属性进行默认初始化,然后调用其构造函数进行显示初始化

   而在构造函数中,会先调用父类构造函数进行初始化:

     (1)先对父类属性进行默认初始化,然后初始化父类构造函数;

     (2)父类初始化完后,再初始化子类属性,然后子类构造函数进行初始化;

     (3)初始化完后把地址赋值给子类的引用变量;

  1.  
    public class Person{
  2.  
    private String name;
  3.  
    private int age;
  4.  
     
  5.  
    public Person(String name, int age) {
  6.  
    this.name = name;
  7.  
    this.age = age;
  8.  
    System.out.println("这是Person构造函数");
  9.  
    this.show();
  10.  
    }
  11.  
    public void show()
  12.  
    {
  13.  
    System.out.println("这是Person show()函数");
  14.  
    }
  15.  
    }

 

  1.  
    public class Student extends Person {
  2.  
     
  3.  
    public Student(String name, int age){
  4.  
    super(name,age);
  5.  
    System.out.println("这是Student构造函数");
  6.  
    super.show();
  7.  
    show();
  8.  
    }
  9.  
     
  10.  
    public void show()
  11.  
    {
  12.  
    System.out.println("这是Student show()函数");
  13.  
    }
  14.  
     
  15.  
    public static void main(String[] args){
  16.  
    Student student = new Student("uzi",23);
  17.  
    }
  18.  
    }

 

运行结果:

      这是Person构造函数
      这是Student  show()函数
      这是Student构造函数
      这是Person  show()函数
      这是Student  show()函数

这就是构造方法中引用动态绑定方法,就是调用方法是取决于new关键字new出来的实例,而与前面的对象引用变量是哪个类无关,这也是多态的一种表现

posted @ 2020-12-25 13:32  zhaoxilai  阅读(684)  评论(0编辑  收藏  举报