JAVA的初始化顺序(续)
JAVA在创建对象之前,是先加载类,然后再创建对象。
加载类时,会加载静态的成员变量,包括父类的静态成员变量[先加载父类,再加载子类]。
一、 静态成员变量的初始化
package com.cnblog.GDUTtiantian.init;
/**
* @author GDUTtiantian
* 静态成员变量的初始化
*/
public class StaticInit {
private static StaticInit s = new StaticInit();//
private static int index = 0;
private static String ptr;
static {//第一个静态代码块
index = 1;
ptr = name = "newname.";
//System.out.println("name:" + name);//这里编译时会报错:Cannot reference a field before it is defined
System.out.println("name:" + ptr);
System.out.println("The " + index + " Code Block.");
}
private static String name = "GDUTtiantian";
static {//第二个静态代码块
index = 2;
System.out.println("name:" + name);
System.out.println("The " + index + " Code Block.");
}
public StaticInit(){
System.out.println("Constructor:" + this.getClass().getSimpleName());
}
public static void main(String[] args) {
System.out.println("------------------");
StaticInit s = new StaticInit();
System.out.println("------------------");
}
static {//第三个静态代码块
index = 3;
System.out.println("The " + index + " Code Block.");
}
}
运行结果:
Constructor:StaticInit name:newname. The 1 Code Block. name:GDUTtiantian The 2 Code Block. The 3 Code Block. ------------------ Constructor:StaticInit ------------------
二、 静态成员变量和非静态成员变量的初始化
package com.cnblog.GDUTtiantian.init;
/**
* @author GDUTtiantian
* 静态成员变量和非静态成员变量的初始化
*/
public class StaticInit2 {
//private static Static2 s = new Static2();//
private static int index = 0;
private static String ptr;
{//第一个【非】静态代码块
//这里编译不会出错,主要是当前代码块处于name属性的作用域范围。
this.flag = "GDUT";
System.out.println("[非静态变量初始化]:代码块1");
}
{//第两个【非】静态代码块
System.out.println("[非静态变量初始化]:代码块2");
}
private String flag = "tiantian";
static {//第一个静态代码块
index = 1;
ptr = name = "newname.";
//System.out.println("name:" + name);//这里编译时会报错:Cannot reference a field before it is defined
System.out.println("name:" + ptr);
System.out.println("The " + index + " Code Block.");
}
private static String name = "GDUTtiantian";
static {//第二个静态代码块
index = 2;
System.out.println("name:" + name);
System.out.println("The " + index + " Code Block.");
}
public StaticInit2(){
System.out.println("Constructor:" + this.getClass().getSimpleName());
}
public static void main(String[] args) {
System.out.println("------------------");
StaticInit2 s = new StaticInit2();
System.out.println("------------------");
}
static {//第三个静态代码块
index = 3;
System.out.println("The " + index + " Code Block.");
}
{//第三个【非】静态代码块
System.out.println("[非静态变量初始化]:代码块3");
}
}
运行结果:
name:newname. The 1 Code Block. name:GDUTtiantian The 2 Code Block. The 3 Code Block. ------------------ [非静态变量初始化]:代码块1 [非静态变量初始化]:代码块2 [非静态变量初始化]:代码块3 Constructor:StaticInit2 ------------------
三、 总结:
还有一种情况是,父类和子类的成员变量的初始化情况,父类含有静态和非静态成员变量,子类也含有静态和非静态成员变量。
在这种情况下,会先初始化父类的静态成员变量,然后再是子类的静态成员变量; <-----【静态成员变量初始化】
接着初始化父类的非静态成员变量,最后是子类的非静态成员变量。 <------【非静态成员变量初始化】
补充:
JVM执行初始化操作时,非构造方法外面的非静态初始化代码(块),都会被加载到构造方法中,放在其他代码的最前面;
接着是父类的构造方法,子类显式/隐式调用父类的构造方法,而且父类构造方法是放在子类构造方法的首行,如果不存在对应的父类构造方法,则会编译出错。
欢迎讨论交流, 我的主页:http://www.cnblogs.com/GDUT/
我的邮箱:zone.technology.exchange@gmail.com
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)不考 ...
随机推荐
- go特性学习
而后我写了一些测试代码: dept1 := Dept{ name: "MySohu", building: "Intern ...
- 关于HTML(JSP)页面的缓存设置 -- cache-control
我在项目中遇到这么一个问题,当用户登录了系统后,进入并copy下系统某个页面的link,然后关闭浏览器,重新打开浏览器,把刚才复制好的link paste到浏览器的地址栏去,直接enter,发现浏览器 ...
- Fastcgi介绍和php中fastcgi的应用
先看下FastCgi的一些解释: CGI全称是“通用网关接口”(Common Gateway Interface), 它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据. CGI描述 ...
- VS2012调试时无法启动程序和拒绝访问问题汇总
很多人在使用VS2012的时候会出现下面所示的问题,我也是,而且不止一次,也不是同样的问题,我这里就把一些常见的解决方法罗列一下.
- 快速升级php5.6
!!yum list installed | grep phpcd /etc/yum.repos.drpm -Uvh https://mirror.webtatic.com/yum/el6/lates ...
- jquery mobile开发笔记之Ajax提交数据(转)
http://my.oschina.net/xiahuawuyu/blog/81763 这两天学习了下,jquery mobile(以下简称jqm)的开发相关的内容.可能之前有过web的开发基础,相对 ...
- 灭顶之灾之网络电视精灵——S2 2.8
从前,有一个神奇的东西叫做搞搞精灵 关于他,有一段历史. 哎呀!我去!写不下去了. -.-以上玩笑 首先需求分析 TreeView显示两种频道 TypeA和TypeB 所以创建三个类 ChannelB ...
- ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆AnalyzerTool分词工具.非常实用!
AnalyzerTool分词工具.非常实用! 可以查看某串字符最终被分割成什么样子,这样便于查询时深刻明白为什么有的查不到有的却能查到. package com.isoftstone.www.tool ...
- PHP--字符串处理函数
字符串的声明 1. 2. 3. [注]单引号与双引号声明字符串的区别: 1.strlen():获取字符串长度 2.substr():截取字符串 3.strpos():查找字符串在指定字符串中的位置 4 ...
- Dev GridControl数据导出格式问题
环境:DevExpress9.3,Vs2008 DevExpress的GridControl提供方便的数据导出到Excel功能,导出中用户可以根据GridControl的格式进行导出(ExportTo ...