JAVA初始化顺序验证
2016-02-17 17:00
267 查看
class InitDemo
{
public static void main(String[] args)
{
//System.out.println(ABC.ID);
//new ABC("xiaowang");
new EFG("xiaoli",20);
/* 输出结果:
D:\EditPlusJava>java InitDemo
ABC静态代码块static{}numABC
EFG静态代码块static{}numEFG
ABC非静态代码块{}abc
ABC构造函数xiaoli
EFG非静态代码块{}efg
EFG构造函数xiaoli20
//测试静态语句块,和静态赋值语句是同等的权重,所以必须让静态赋值语句放到语句块的前面。
否则就会报下面的错误:
//D:\EditPlusJava>javac InitDemo.java
//InitDemo.java:32: 错误: 非法前向引用
// System.out.println("ABC静态代码块static{}"+ID);
通过执行顺序可以看到:
先执行父类的静态语句,静态代码块;然后是子类的静态语句块静态代码块。 --》初始化2个类。
然后第二步,执行对象的初始化;首先执行父类的非静态赋值语句,和非静态代码块;然后执行父类的构造函数;然后执行子类的非静态赋值语句,非静态
代码块,然后再执行子类的构造函数。
//为什么构建子类对象一定要构建父类对象,是因为子类要继承父类对象的属性;这些属性,必须在生产对象之前初始化。调用构造函数之前默认会初始化;
所以子类继承过来后,就可以直接调用已经被初始化后的值。
*/
}
}
class ABC
{
String name="abc";
public static String ID="numABC";
static {
System.out.println("ABC静态代码块static{}"+ID);
}
ABC(String name){
this.name=name;
System.out.println("ABC构造函数"+name);
}
{
System.out.println("ABC非静态代码块{}"+name);
}
}
class EFG extends ABC
{
String name1="efg";
int age=20;
{
System.out.println("EFG非静态代码块{}"+name1);
}
public static String ID1="numEFG";
static {
System.out.println("EFG静态代码块static{}"+ID1);
}
EFG(String name1,int age){
super(name1);
this.age=age;
System.out.println("EFG构造函数"+name+age);
}
}
{
public static void main(String[] args)
{
//System.out.println(ABC.ID);
//new ABC("xiaowang");
new EFG("xiaoli",20);
/* 输出结果:
D:\EditPlusJava>java InitDemo
ABC静态代码块static{}numABC
EFG静态代码块static{}numEFG
ABC非静态代码块{}abc
ABC构造函数xiaoli
EFG非静态代码块{}efg
EFG构造函数xiaoli20
//测试静态语句块,和静态赋值语句是同等的权重,所以必须让静态赋值语句放到语句块的前面。
否则就会报下面的错误:
//D:\EditPlusJava>javac InitDemo.java
//InitDemo.java:32: 错误: 非法前向引用
// System.out.println("ABC静态代码块static{}"+ID);
通过执行顺序可以看到:
先执行父类的静态语句,静态代码块;然后是子类的静态语句块静态代码块。 --》初始化2个类。
然后第二步,执行对象的初始化;首先执行父类的非静态赋值语句,和非静态代码块;然后执行父类的构造函数;然后执行子类的非静态赋值语句,非静态
代码块,然后再执行子类的构造函数。
//为什么构建子类对象一定要构建父类对象,是因为子类要继承父类对象的属性;这些属性,必须在生产对象之前初始化。调用构造函数之前默认会初始化;
所以子类继承过来后,就可以直接调用已经被初始化后的值。
*/
}
}
class ABC
{
String name="abc";
public static String ID="numABC";
static {
System.out.println("ABC静态代码块static{}"+ID);
}
ABC(String name){
this.name=name;
System.out.println("ABC构造函数"+name);
}
{
System.out.println("ABC非静态代码块{}"+name);
}
}
class EFG extends ABC
{
String name1="efg";
int age=20;
{
System.out.println("EFG非静态代码块{}"+name1);
}
public static String ID1="numEFG";
static {
System.out.println("EFG静态代码块static{}"+ID1);
}
EFG(String name1,int age){
super(name1);
this.age=age;
System.out.println("EFG构造函数"+name+age);
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树