• 对象实例化过程


    对象实例化过程:

        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出来的实例,而与前面的对象引用变量是哪个类无关,这也是多态的一种表现

  • 相关阅读:
    前置++和后置++的区别
    snmp数据包分析
    [codeforces538E]Demiurges Play Again
    [codeforces538D]Weird Chess
    [BZOJ3772]精神污染
    [BZOJ4026]dC Loves Number Theory
    [BZOJ1878][SDOI2009]HH的项链
    [BZOJ3658]Jabberwocky
    [BZOJ3932][CQOI2015]任务查询系统
    [BZOJ3551][ONTAK2010]Peaks加强版
  • 原文地址:https://www.cnblogs.com/1994xlai/p/14188457.html
Copyright © 2020-2023  润新知