JAVA的初始化顺序
这里主要是介绍JAVA的类的初始化顺序,比较基础;主要是以例子演示为主:
例子一:
1 package com.cnblog.GDUTtiantian; 2 3 /** 4 * 5 * @author GDUTtiantian 6 * @date 2014-5-19 下午1:30:10 7 * JAVA类的初始化顺序 8 */ 9 public class Tiantian { 10 11 { 12 System.out.println("初始化:代码块1"); 13 } 14 15 { 16 System.out.println("初始化:代码块2"); 17 } 18 19 public Tiantian(){ 20 21 System.out.println("Constructor:Tiantian"); 22 } 23 24 { 25 System.out.println("初始化:代码块3"); 26 } 27 28 public static void main(String[] args) { 29 Tiantian client = new Tiantian(); 30 } 31 32 }
例子一运行结果: 初始化:代码块1 初始化:代码块2 初始化:代码块3 Constructor:Tiantian
非静态代码块和普通变量一样,按照在程序出现的先后顺序,被加载到构造器中进行初始化;所以它们被初始化的顺序就是在程序中的出现的先后顺序。
下一步,稍微修改下例子一的代码:
例子二:
1 package com.cnblog.GDUTtiantian; 2 3 /** 4 * 5 * @author GDUTtiantian 6 * @date 2014-5-19 下午1:30:10 7 * JAVA类的初始化顺序 8 */ 9 public class Tiantian { 10 11 { 12 //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。 13 this.name = "GDUT"; 14 System.out.println("初始化:代码块1"); 15 } 16 17 { 18 System.out.println("初始化:代码块2"); 19 } 20 21 private String name = "tiantian"; 22 23 public Tiantian(){ 24 25 System.out.println("Constructor:Tiantian"); 26 } 27 28 { 29 System.out.println("初始化:代码块3"); 30 } 31 32 public static void main(String[] args) { 33 Tiantian client = new Tiantian(); 34 System.out.println(client.name); 35 } 36 37 }
例子二运行结果: 初始化:代码块1 初始化:代码块3 初始化:代码块3 Constructor:Tiantian tiantian
理解了这里,可以帮助更好地理解JAVA类的初始化过程。JAVA类不是在定义private String name = "tiantian";的时候先对name进行初始化,而是在代码块一中就对name进行了初始化,name的值为”GDUT”,然后再进一步初始化,name的值为”tiantian”.下面一个例子主要是针对具有继承关系的两个类的初始化顺序的探讨。
例子三:
1 package com.cnblog.GDUTtiantian; 2 3 4 class Parent {//父类 5 6 {//Parent:block 1 7 this.name = "My parent."; 8 System.out.println("Parent:代码块1"); 9 } 10 11 private String name = "A Parent."; 12 13 {//Parent:block 2 14 this.name = "Your parent."; 15 System.out.println("Parent:代码块2"); 16 } 17 18 19 public Parent(){ 20 System.out.println("Constructor:Parent"); 21 System.out.println(this.name); 22 } 23 24 {//Parent:block 3 25 this.name = "Their parent."; 26 System.out.println("Parent:代码块3"); 27 } 28 } 29 30 /** 31 * 32 * @author GDUTtiantian 33 * @date 2014-5-19 下午1:30:10 34 * JAVA类的初始化顺序 35 */ 36 public class Tiantian extends Parent{ 37 38 {//block 1 39 //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。 40 this.name = "GDUT"; 41 System.out.println("初始化:代码块1"); 42 } 43 44 {//block 2 45 System.out.println("初始化:代码块2"); 46 } 47 48 private String name = "tiantian"; 49 50 public Tiantian(){ 51 52 System.out.println("Constructor:Tiantian"); 53 } 54 55 {//block 3 56 System.out.println("初始化:代码块3"); 57 } 58 59 public static void main(String[] args) { 60 Tiantian client = new Tiantian(); 61 System.out.println(client.name); 62 } 63 64 }
例子三运行结果: Parent:代码块1 Parent:代码块2 Parent:代码块3 Constructor:Parent Their parent. 初始化:代码块1 初始化:代码块2 初始化:代码块3 Constructor:Tiantian tiantian
首先,初始化子类时,会先去调用父类的构造器(如果没有显示调用,则编译器会自动调用父类的无参构造器,如果此时父类没有无参构造器,则编译会出错。),如果父类有继承其他类,则会调用其他类的构造器;否则,和例子二的初始化顺序一样。
总结:这里主要是涉及类的初始化,仅仅是非静态属性的初始化;还有其他的东西,后面会继续完善。
以上是个人的观点,欢迎交流讨论。
[从文章转到随笔]
JAVA的初始化顺序的更多相关文章
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- JAVA的初始化顺序:
JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...
- java 继承 初始化顺序
面向对象三大特性: 封装,继承,多态 java 继承初始化顺序 先初始化父类对象, 在父类对象中先初始化父类属性,再初始化父类的构造方法,然后初始化子类对象,初始化子类对象的属性,初始化子类的构造方法 ...
- 【知识总结】Java类初始化顺序说明
微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...
- java继承 初始化顺序
java继承 初始化顺序 标签: 初始化顺序 2013-08-01 10:13 879人阅读 评论(0) 收藏 举报 分类: java(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java变量、Java对象初始化顺序
局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...
- Java对象初始化顺序
最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test; public class Upper { String upperSt ...
- Android(java)学习笔记136:Java类初始化顺序
Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化( ...
- 【细说Java】Java变量初始化顺序
Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...
随机推荐
- BZOJ1217或洛谷2279 [HNOI2003]消防局的设立
BZOJ原题链接 洛谷原题链接 该题有两种做法,树形\(DP\)和贪心. 先讲贪心. 先将所有点按深度从大到小排序,然后从大到小依次取出点,若已经被覆盖则跳过,否则就在它的祖父点建立消防站. 考虑如何 ...
- imaplib.error: command: SEARCH => got more than 10000 bytes
imaplib.error: command: SEARCH => got more than 10000 bytes 使用IMAPLIB进行标记邮件状态的时候,在 typ,data=M.sea ...
- 超全面!UI设计师如何适配2018新款iPhone
北京时间9月13日凌晨1点,苹果在美国加利福尼亚州的Apple Park园区召开了2018年苹果秋季新品发布会. 很多人对这次科技界的春晚充满了期待,除了那些让人“剁手”的新品,设计师关注的还有新手机 ...
- Spring PropertyResolver 占位符解析(一)API 介绍
Spring PropertyResolver 占位符解析(一)API 介绍 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...
- Spring 循环引用(二)源码分析
Spring 循环引用(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环引用相关文章: & ...
- Robotframework与unittest对比
都可以自动挂ui测试 都可以自动化接口测试
- 多种方式判断PC端,IOS端,移动端
1. 通过判断浏览器的userAgent,用正则来判断手机是否是IOS(苹果)和Android(安卓)客户端. var u = navigator.userAgent; var isAndroid = ...
- activiti5.22整合modeler时出错TypeError: Cannot read property 'split' of undefined
activiti5.22.0整合modeler时,打开的流程页面不显示工具栏和左边的控件栏,产生如下的错误: TypeError: Cannot read property 'split' of un ...
- Java学习笔记:多线程(一)
Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...
- idea maven编译jdk报错
<!--自己添加的,用来控制maven编译时的jdk版本--> <plugins> <plugin> <groupId>org.apache.maven ...