博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java类加载及new对象的过程
阅读量:6070 次
发布时间:2019-06-20

本文共 1720 字,大约阅读时间需要 5 分钟。

hot3.png

SubClass sub = new SubClass(); 

这句话到底做了什么事情呢? 

  1. javac编译.java源文件形成.class字节码文件; 
  2. new SubClass()对象时,先检查有没有父类,有父类,类加载器(ClassLoader)先将父类的Class文件读入内存,创建一个java.lang.Class对象,然后加载子类,类加载器将子类的Class文件读入内存,创建一个java.lang.Class对象; 
  3. 先初始化父类的静态属性,再初始化父类的静态代码块; 
  4. 再初始化子类的静态属性,再初始化子类的静态代码; 
  5. 在堆内存中分配内存空间,分配内存地址,此时是因为父类的特有属性才在堆内存中为父类对象分配空间。 
  6. 初始化父类的特有属性。 
  7. 初始化父类的构造代码块。 
  8. 初始化父类对象相应的构造方法。 
  9. 在堆内存中分配内存空间,分配内存地址,此时是因为子类的特有属性才在堆内存中为子类对象分配空间的。 
  10. 初始化子类的特有属性。 
  11. 初始化子类的构造代码块。 
  12. 初始化子类相应的构造方法。 
  13. 将子类的内存地址赋值给栈中的引用对象。
public class ParentClass {    // 静态变量    public static String staticField = "父类--静态变量";    public String field = "父类--普通变量";    // 静态块    static {        System.out.println(staticField);        System.out.println("父类--静态块");    }    // 初始化块    {        System.out.println(field);        System.out.println("父类--普通块");    }    // 构造器    public ParentClass() {        System.out.println("父类--构造器");    }}
public class SubClass extends ParentClass {    // 静态变量    public static String sstaticField = "子类--静态变量";    // 变量    public String sField = "子类--变量";    // 静态块    static {        System.out.println(sstaticField);        System.out.println("子类--静态块");    }    // 初始化块    {        System.out.println(sField);        System.out.println("子类--普通块");    }    // 构造器    public SubClass() {        System.out.println("子类--构造器");    }    public static void main(String[] args) {        System.out.println("顺序:" + "第一次new SubClass");        SubClass sub = new SubClass();        System.out.println("顺序:" + "第二次new SubClass");        new SubClass();    }}

程序执行的结果为:  

父类–静态变量 父类–静态块 子类–静态变量 子类–静态块 顺序:第一次new SubClass 父类–普通变量 父类–普通块 父类–构造器 子类–变量 子类–普通块 子类–构造器 顺序:第二次new SubClass 父类–普通变量 父类–普通块 父类–构造器 子类–变量 子类–普通块 子类–构造器

 

转载于:https://my.oschina.net/u/3198904/blog/1786009

你可能感兴趣的文章
程序员应该知道的100个Vim命令
查看>>
实验设计与排错之一静态路由
查看>>
第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及...
查看>>
如何应对勒索病毒
查看>>
Servlet系列文章(一)
查看>>
点击文件下载
查看>>
纯java环境下sqlsqlcipher解密sqlite数据库文件
查看>>
思科路由器基本命令学习总结
查看>>
Mysql 5.7.9源代码安装
查看>>
【表单设计】input的size和maxlength属性
查看>>
存储方案与存储产品之DAS篇
查看>>
Solr1.3的核心机制
查看>>
vue 按需加载
查看>>
OpenCV编程->ROI区域保存为图片
查看>>
SS哥的crontab教程
查看>>
python 面向对象
查看>>
兼职议会
查看>>
2012.12.18
查看>>
rpm包管理和yum的使用
查看>>
Linux tmux
查看>>