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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白的技术客栈

Python运算符

今天开始讲解Python的运算符,这一节比较简单,知识点不多。 上文回顾 今天回顾一下昨天的文章主要讲了哪些知识点: Python是一门动态的强类型语言; 变量...

4178
来自专栏编程

Python 迭代器和生成器

来源:田小计划 www.cnblogs.com/wilber2013/p/4652531.html 在Python中,很多对象都是可以通过for语句来直接遍历的...

18810
来自专栏数据结构与算法

20:删除单词后缀

20:删除单词后缀 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(题目保...

3564
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(三)——创建对象的几种方式

有了前面两篇文章的基础后,我们来谈一谈在JS中创建对象的几种方式。 建议大家先预习下先前的两篇博客: 稳扎稳打JavaScript(一)——作用域链 ...

4304
来自专栏云霄雨霁

Java--反射机制

1494
来自专栏Youngxj

一维数组-c语言学习笔记

1726
来自专栏Celebi的专栏

C/C++ 学习笔记四(指针、数组)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

1310
来自专栏Web项目聚集地

一文读懂 Java 反射机制那些事

前不久学习了反射机制,来总结下。在此之前,回顾下java程序的编译运行过程,分为三个阶段:源码(.java文件)进过编译生成字节码文件(.class文件),然后...

914
来自专栏零基础使用Django2.0.1打造在线教育网站

关于JAVA你必须知道的那些事(三):继承和访问修饰符

今天乘着还有一些时间,把上次拖欠的面向对象编程三大特性中遗留的继承和多态给简单说明一下。这一部分还是非常重要的,需要仔细思考。

863
来自专栏运维技术迷

连仕彤博客[Python笔记] locals() 函数

1433

扫码关注云+社区