java类的初始化和对象的创建顺序

学习java编程思想--类的初始化p146

 类的加载顺序
* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类
* 2类初始化先初始化static成员变量和static--->
* 2先初始化父类的static成员变量和static
* 3再初始化本类的static成员变量和static

* 类加载之后,对象创建开始
* 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)
* 2先加载父类的构造函数
* 3再加载本类的非静态成员变量
* 4再加载本类的构造函数
*

总体:
* -->表示顺序
* 父类-->子类
* 静态-->非静态
* 类-->对象
* static随类的加载而加载
* 非static成员变量随对象的创建而加载
* 成员变量先于构造器加载

 

复制代码
 1 package com.test.java.classs;
 2 
 3 /**
 4  * Created by Administrator on 2015/12/8.
 5  * 类的加载顺序
 6  * 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类
 7  * 2类初始化先初始化static成员变量和static--->
 8  * 2先初始化父类的static成员变量和static
 9  * 3再初始化本类的static成员变量和static
10  * 类加载之后,对象创建开始加载
11  * 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)
12  * 2先加载父类的构造函数
13  * 3再加载本类的非静态成员变量
14  * 4再加载本类的构造函数
15  *
16  * 总体:
17  * -->表示顺序
18  * 父类-->子类
19  * 静态-->非静态
20  * 类-->对象
21  * static随类的加载而加载
22  * 非static成员变量随对象的创建而加载
23  * 成员变量先于构造器加载
24  *
25  */
26 public class ClassLoadOrder extends Father{
27     //2父类的static成员变量加载完之后 开始加载子类的static域
28     private static int k = printInt("child static k initialized");
29     //5 子类的非静态成员变量初始化
30     private int m = printInt("child 非static 变量加载");
31 
32     //子类的构造器加载
33     public ClassLoadOrder() {
34         System.out.println("child constructor initialized");
35         System.out.println("k="+k);
36         System.out.println("j="+j);
37     }
38 
39     static {
40         System.out.println("child static initialized");
41     }
42     static int printInt2(){
43         System.out.println("child static function initialized");
44         return 50;
45     }
46 
47     public static void main(String[] args) {
48         ClassLoadOrder c = new ClassLoadOrder();
49     }
50 }
51 
52 class Father{
53     private int i=9;
54     protected int j;
55     //4 父类构造器加载
56     Father(){
57         System.out.println("father constructor initialized");
58         System.out.println("i="+i+",j="+j);
59         j=39;
60     }
61     //3 对象创建时,先初始化父类的非静态成员变量
62     int n = printInt("father 非static变量加载");
63     //1先加载父类的static域
64     static {
65         System.out.println("father static initialized");
66     }
67     //1
68     private static int x1 = printInt("father static .x1 initialized");
69     static int printInt(String s ){
70         System.out.println(s);
71         return 47;
72     }
73 }
复制代码

结果:

father static initialized
father static .x1 initialized
child static k initialized
child static initialized
father 非static变量加载
father constructor initialized
i=9,j=0
child 非static 变量加载
child constructor initialized
k=47
j=39

posted @   Ryan.Miao  阅读(782)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示