java类的初始化和对象的创建顺序
2016-09-20 17:42
302 查看
学习java编程思想--类的初始化p146
结果:
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
类的加载顺序 * 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
相关文章推荐
- java中复制对象通过反射或序列化
- java反射实现动态代理
- java日志组件介绍(common-logging,log4j,slf4j,logback )
- java类实现serializable有什么好处或意义
- No compiler is provided in this environment. Perhaps you are ada1 running on a JRE rather than a JDK?
- spring学习遇到的问题汇总
- eclipse中断点调试debug
- java中map插入相同的key
- Spring AOP中pointcut expression表达式解析
- java中String的相等比较
- Retrofit2.0 上传图片
- spring注解
- Java数据通讯中使用Google Protobuf 序列化与反序列化
- java中遇到过的String的一些特性
- springMVC+easyUI实现combobox动态级联查询
- maven构建Spring项目
- Java: 日期相关的类 XMLGregorianCalendar 和 GregorianCalendar
- 使用Maven构建Struts2项目
- SpringMVc+FlexPaper实习文档的在线阅览
- [Java]XML与JAXB