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的闭包(Closure)与惰性计算(Lazy Evaluation)

闭包 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成...

26210
来自专栏编程

Python 迭代器和生成器

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

19910
来自专栏小白的技术客栈

Python运算符

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

4618
来自专栏专注 Java 基础分享

反射的基本原理

1523
来自专栏文武兼修ing——机器学习与IC设计

JavaScript入门笔记(6)标准对象面向对象编程

标准对象 正则对象 正则表达式是一种处理文本信息的神器,在JavaScript中可以方便的使用正则对象对文本进行处理。JavaScript中声明正则对象可以使用...

3228
来自专栏云霄雨霁

Java--反射机制

1594
来自专栏锦小年的博客

python学习笔记4.1-python高级之生成器

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。 如果一个函数包含yield关键字,这个函数就会变...

2179
来自专栏java初学

final和static关键字

35911
来自专栏Java学习123

Java反射(一)

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

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

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

1043

扫码关注云+社区