共同讨论类成员初始化顺序的问题

lovecj6185 2009-06-25 02:05:52
自己总结了一些关于类成员初始化的规则,有错误或不足的地方,
还恳请大家能够给与指出或者给与补充,
目的是为了形成一个比较正确的认识

1.单个类的成员初始化

public class Single {

public static void main(String[] args) {
new Monkey();
}
}

class Monkey{

Cat c2 = new Cat(2);

static Cat c1 = new Cat(1);

static {
System.out.println("Monkey static block");
}

{
System.out.println("initialization blcok");
}

Monkey(){
System.out.println("Monkey()");
}
}

class Cat{
Cat(int i){
System.out.println("Cat("+i+")");
}
}


运行结果为:

Cat(1)
Monkey static block
Cat(2)
initialization blcok
Monkey()

由上面例子可以看出,单一的类在初始化时,
静态成员(静态变量,静态初始化块)-〉非静态成员(类变量,初始化块)-〉构造器
其中,多个静态成员在初始化时,依照其在代码中出现的顺序
复数的非静态成员也是同样
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovecj6185 2009-06-30
  • 打赏
  • 举报
回复
嗯,看来大家的意见基本上是一致的
OK,结贴发分
踏雪无痕 2009-06-25
  • 打赏
  • 举报
回复
父类静态部分(静态属性和静态块)-子类静态部分-父类非静态属性-父类构造函数-子类非静态属性-子类构造函数
kingssman 2009-06-25
  • 打赏
  • 举报
回复
学习学习再学习
bigbug9002 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xnjnmn 的回复:]
父静子静,父构子构
[/Quote]
顶一下.
不好改成:
父鲸子鲸,父狗子狗,更符合继承的原理?
xnjnmn 2009-06-25
  • 打赏
  • 举报
回复
父静子静,父构子构
lovecj6185 2009-06-25
  • 打赏
  • 举报
回复
2.继承关系中类成员的初始化


public class House {
public House(String name){
System.out.println(name+" 's house");
}
}

public class GrandFather{
protected GrandFather(){
System.out.println("GrandFather()");
}

static{
System.out.println("static block in GrandFather");
}

{
System.out.println("initialization in GrandFather");
}

static House h1 = new House("static GrandFather");

House h2 = new House("GrandFather");
}

public class Father extends GrandFather{

static {
System.out.println("static block in Father");
}

static House h1 = new House("static Father");

protected Father(){
System.out.println("Father()");
}

{
System.out.println("initialization in Father");
}
}

public class son extends Father{

son() {
System.out.println("son()");
}

public static void main(String[] args) {
System.out.println("********entry in main********");
new son();
}

static House h1 = new House("static son");

static{
System.out.println("static block in son");
}

House h2 = new House("son");

{
System.out.println("block in son");
}

}


运行结果:

static block in GrandFather
static GrandFather 's house
static block in Father
static Father 's house
static son 's house
static block in son
********entry in main********
initialization in GrandFather
GrandFather 's house
GrandFather()
initialization in Father
Father()
son 's house
block in son
son()

结论:
在继承关系中,类成员的初始化遵照以下顺序

①最外层超类的静态成员
②超类静态成员
③子类静态成员
④最外层超类的非静态成员
⑤最外层超类的构造器
⑥超类的非静态成员
⑦超类的构造器
⑧子类的非静态成员
⑨子类构造器

其中,相同类型(同为静态或者非静态成员)复数成员的初始化,遵照其在代码中出现的顺序。
ouyangxiaokang6 2009-06-25
  • 打赏
  • 举报
回复
1、超类静态变量;超类静态初始化块。--按排列顺序;
2、子类静态变量;子类静态初始化块。--按排列顺序;
3、超类成员变量;超类初始化块。--按排列顺序;
4、超类构造函数。
5、子类成员变量;子类初始化块。--按排列顺序;
6、子类构造函数。
和lz的差不多,大概就是这个顺序。
bigbug9002 2009-06-25
  • 打赏
  • 举报
回复
这个比较麻烦,我老记不住,我索性就不去记它了。
静态成员是一个对象时,初始化更麻烦。
初始化是时机也是比较重要的。比如什么时候静态成员才进行补初始化,什么时候初始化块才执行?等,烦人啊。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧