站内搜索: 请输入搜索关键词

当前页面: JAVA 编程资料牛鼻论坛Java & J2SE 技术区→关于初始化的一点体会,如有错误,请指点一二

关于初始化的一点体会,如有错误,请指点一二

发表新主题   回复此主题

第1楼 2004-07-15 17:47 蓝色沉默 写道:

关于初始化的一点体会,如有错误,请指点一二


class Egg2 {
static int i=5;
int j=5;
static//父类静态变量初始化块首先被执行,在main方法之前。
{
System.out.println("superClass static block initialized ");
}
protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
}
public void f() {
System.out.println("call method f() in superClass");

}
private void m() {
System.out.println("call method m() in superClass");
}

}

private Yolk y = new Yolk();//y是Yolk的对象同时是Egg2的成员
{ //非静态变量语句块,在静态语句块之后,main方法之后,构造方法之前执行
System.out.println("superClass member block initialized");
}
public Egg2() {
System.out.println("New Egg2()");//2
System.out.println("Egg2`s constructor initialized");

}
public void insertYolk(Yolk yy) {
y = yy;
}
public void g() {
y.f();
y.m();

}
private void n() {
System.out.println("method n() in superClass");
}
}
public class BigEgg2 extends Egg2 {
static int i;
int j=10;
static //子类静态初始化块在父类静态初始化块后执行,在main方法之前。
{
System.out.println("subClass static block initialized");
}
{ //子类的非静态初始化块
Yolk subY =new Yolk();
System.out.println("subClass member block initialized");
}
public class Yolk extends Egg2.Yolk {
public Yolk() {
System.out.println("BigEgg2.Yolk()");
}
public void f() {
System.out.println("invoke method f() in subClass");
}
public void m() {
System.out.println("invoke method m() in subClass");
}
}
public BigEgg2() {
System.out.println("begin new Yolk() in BigEgg2`s constructor");
insertYolk(new Yolk());

}
public void n() {
System.out.println("method n() in subClass");
}
public static void main(String[] args) {
System.out.println("main begins!");
System.out.println("-------------------------------");
Egg2 e2 = new BigEgg2();
e2.g();
//e2.n(); error! 因为父类的n方法是private的,所以无法在此访问
System.out.println("e2.i= "+e2.i);
System.out.println("e2.j= "+e2.j);
System.out.println("-------------------------------");
BigEgg2 ee=new BigEgg2();
ee.g();
ee.n();
System.out.println("ee.i= "+ee.i);
System.out.println("ee.j= "+ee.j);
System.out.println("i = "+i);
}
}
/* The Result:
superClass static block initialized
subClass static block initialized
main begins!
-------------------------------
Egg2.Yolk() 由于private Yolk y = new Yolk();创建Yolk的对象,调用
Yolk的构造方法,因此此句被输出来。
superClass member block initialized 在父类构造方法之前初始化
New Egg2()在非静态变量初始化完毕后
Egg2`s constructor initialized 构造方法开始初始化
Egg2.Yolk()经过了静态初始化,父类非静态变量初始化,父类构造方法初始化后,子类终于开始了自己的初始化,首先先做非静态变量初始化吧。
BigEgg2.Yolk()因为Yolk subY =new Yolk();所以先调用父类的构造方法,在
subClass member block initialized子类的构造方法,以上2句被输出
begin new Yolk() in BigEgg2`s constructor开始子类的构造方法初始化
Egg2.Yolk()因为insertYolk(new Yolk());又再次new Yolk()所以再次输出
BigEgg2.Yolk()内部类同样是外部类的成员,如同方法一样,因为子类的内部类与父类的内部类同名,所以发生override关系。先调用父类的构造,再子类的构造。
invoke method f() in subClass因为是在父类的方法中调用f方法,所以JVM会先检查父类中的f()方法,再调用时,却因为子类override了父类的f方法,所以会调用子类的f方法而不会调用父类的f方法。
call method m() in superClass因为父类的m方法是private的所以直接调用父类的,而不会调用子类的。
e2.i=5 因为e2是通过Egg2 e2 = new BigEgg2();创建的,属于Egg2的引用,
BigEgg2的对象,因此它会首先在Egg2中寻找调用的方法或变量,再加以赋值,或调用方法
而如果子类的方法override了父类的方法,则会去调用子类的方法,但是变量去只使用父类的而不会使用子类的,因为变量不能override吧。此时如果父类没有i这个变量,则编译报错.cannot resolve symbol
e2.j=5
-------------------------------
Egg2.Yolk()
superClass member block initialized
New Egg2()
Egg2`s constructor initialized
Egg2.Yolk()
BigEgg2.Yolk()
subClass member block initialized
begin new Yolk() in BigEgg2`s constructor
Egg2.Yolk()
BigEgg2.Yolk()
invoke method f() in subClass
call method m() in superClass
method n() in subClass
ee.i=0 由于ee是通过BigEgg2 ee=new BigEgg2()创建的,所以运行时不会去先去寻找父类的变量和方法。直接调用子类的。
ee.j=10
i=0*/
初始化顺序:父类静态初始化→子类静态初始化(在main方法之前)→子类创建对象后→
父类的非静态变量初始化→父类的构造方法初始化→子类的非静态变量初始化→子类的构造方法初始化。
静态初始化与非静态初始化顺序:按照语句顺序逐一进行
这些是小弟对初始化的一些体会,如果有错误的地方,请各位大虾指点指点。


第2楼 2013-08-31 12:44 Robot :

关于初始化的一点体会,如有错误,请指点一二 相关


第3楼 2004-07-16 03:51 xiaoqq 写道:

关于初始化的一点体会,如有错误,请指点一二


太感谢了  我正在学

帮助很大~~  


第4楼 2004-07-16 06:49 东风遇见西风 写道:

关于初始化的一点体会,如有错误,请指点一二


已经比较全面了.写了这么多,真是pf.


第5楼 2004-07-23 15:46 蓝色沉默 写道:

关于初始化的一点体会,如有错误,请指点一二


static初始化只进行一次。而非静态初始化则在每次创建对象时,都要初始化。



第6楼 2004-10-31 01:32 香草咖啡 写道:

关于初始化的一点体会,如有错误,请指点一二


原来如此!!
谢谢!!


第7楼 2004-10-31 19:16 yushaoyong 写道:

关于初始化的一点体会,如有错误,请指点一二


very good!


第8楼 2004-11-02 04:12 whirlybird 写道:

关于初始化的一点体会,如有错误,请指点一二


谢谢了,很有帮助。。。。。


第9楼 2004-11-04 11:39 dragon45 写道:

关于初始化的一点体会,如有错误,请指点一二


正在学习
但是书上讲的不是很细
蓝色沉默 总结的很详细
很好



第10楼 2004-11-11 13:58 xiaodi 写道:

关于初始化的一点体会,如有错误,请指点一二


我得慢慢看,看一次消化不了
精华就是精华


第11楼 2005-07-08 04:19 飘在杭州 写道:

Re:关于初始化的一点体会,如有错误,请指点一二


向楼主致敬!


第12楼 2006-04-21 18:23 内蒙古 写道:

Re:关于初始化的一点体会,如有错误,请指点一二


我向楼主严重致敬 谢谢您的分享啊


第13楼 2006-04-22 18:36 风语战士 写道:

Re:关于初始化的一点体会,如有错误,请指点一二


主要是程序运行顺序的问题

首先找到程序入口 即main方法(即调用类)------static属性被初始化-----static块在类被调用时执行(一次)-----自身构造函数(每次创建对象执行)

初学~~~~勿笑


第14楼 2007-06-23 15:03 lujun0323 写道:

Re: 关于初始化的一点体会,如有错误,请指点一二


哥们儿,你能不能把"{}"写的规则一点啊,我都看迷糊了.谢谢了


第15楼 2007-07-13 11:28 whhyz3003 写道:

回复: 关于初始化的一点体会,如有错误,请指点一二

swimming in java.NBA

发表新主题   回复此主题