简单的小程序,考考你是否认真学了java,看有几个人能不运行直接写出正确答案?
请不运行程序先写出你认为的输出结果:(考考你是否专心学了java)呵呵
public class Test2 extends Test1{
{
System.out.print("1");
}
Test2(){
System.out.print("2");
}
static{
System.out.print("3");
}
{
System.out.print("4");
}
public static void main(String[] args) {
new Test2();
}
}
class Test1 {
Test1(){
System.out.print("5");
}
static{
System.out.print("6");
}
}
问题点数:10、回复次数:116Top
1 楼jackyzgm()回复于 2004-11-04 13:53:46 得分 0
别做事后诸葛亮喔~~Top
2 楼jokerjava(冷血)回复于 2004-11-04 13:56:16 得分 1
试试
3 6 5 2 1 4
Top
3 楼jokerjava(冷血)回复于 2004-11-04 13:57:16 得分 0
差了一个。。。Top
4 楼jokerjava(冷血)回复于 2004-11-04 13:58:50 得分 0
差了两个。。。Top
5 楼jackyzgm()回复于 2004-11-04 13:59:22 得分 0
楼上差大了,哈哈Top
6 楼treeroot(旗鲁特)回复于 2004-11-04 14:00:48 得分 1
好难呀,其实就是14比较难Top
7 楼jackyzgm()回复于 2004-11-04 14:01:44 得分 0
嗯,还是有点玄机的,一不留神或迷糊就。。嘿嘿Top
8 楼treeroot(旗鲁特)回复于 2004-11-04 14:01:54 得分 0
6肯定在3前
5肯定在2前Top
9 楼qinling820123(秦)回复于 2004-11-04 14:02:24 得分 1
晕了Top
10 楼csrcom(泥鳅)回复于 2004-11-04 14:02:32 得分 1
631452Top
11 楼jackyzgm()回复于 2004-11-04 14:04:00 得分 0
-------------
631452
-------------
错罗。。Top
12 楼csrcom(泥鳅)回复于 2004-11-04 14:05:44 得分 0
哇,差了一截啊Top
13 楼csrcom(泥鳅)回复于 2004-11-04 14:06:40 得分 0
总于明白了。以前的理解错误Top
14 楼csrcom(泥鳅)回复于 2004-11-04 14:10:51 得分 0
同类中按静态、非静态循序、构造,继承按类父类到子类的循序。Top
15 楼mr9(mr9)回复于 2004-11-04 14:10:52 得分 1
635142Top
16 楼jokerjava(冷血)回复于 2004-11-04 14:14:21 得分 0
没差很多
static是类加载的时候执行的
我觉得Test2应该先于Test1才对
Test2不加载 怎么可能知道 Test2 继承 Test1
当然 这是我的理解 现在看来是错的 ?why
1 4 优于 2 只是一念之差
Top
17 楼jie015(杰)回复于 2004-11-04 14:14:36 得分 1
6352Top
18 楼zcjl()回复于 2004-11-04 14:21:50 得分 1
稍微改变一下,请谁解释一下5142中为什么14会在52中间?
public class Test2 extends Test1{
{
System.out.print("1");
}
Test2(){
super(3);
System.out.print("2");
}
static{
System.out.print("3");
}
{
System.out.print("4");
}
public static void main(String[] args) {
System.out.print("7");
new Test2();
}
}
class Test1 {
Test1(int i){
System.out.print("5");
}
static{
System.out.print("6");
}
}Top
19 楼jasher(喜怒哀乐)回复于 2004-11-04 14:25:23 得分 1
先执行静态后执行非静态,先执行父类后执行子类
635142Top
20 楼treeroot(旗鲁特)回复于 2004-11-04 14:29:47 得分 0
既然大家这么有兴致,我也弄一道小体,输入什么?
public class Test extends Test1{
int i=30;
Test(){
print();
i=40;
}
public static void main(String[] args) {
System.out.println(new Test().i);
}
void print(){
System.out.println(i);
}
}
class Test1 {
int i=10;
Test1(){
print();
i=20;
}
void print(){
System.out.println(i);
}
}
Top
21 楼jackyzgm()回复于 2004-11-04 14:30:25 得分 0
嘿嘿,原理和我的也一样,这个只是更加细分了过程,我想应该是先父类构造,5在前面没问题。至于为什么2在14后面,还是该看看jvm规范。抛砖引玉。Top
22 楼jackyzgm()回复于 2004-11-04 14:33:30 得分 0
10
30
40
我去试试看对不对Top
23 楼jackyzgm()回复于 2004-11-04 14:36:22 得分 0
啊,为什么第一个不是10而是0呢?Top
24 楼zcjl()回复于 2004-11-04 14:37:30 得分 0
就是从你这个例子演变出来的
我本来的答案是314652:
1.没有注意6是static,应该最先被调用
2.以为1、4先于Test2的构造器被调用,结果竟然是构造器内被调用的,顺序是super后,2之前Top
25 楼007JavaKing(乖乖咙的咚)回复于 2004-11-04 14:40:10 得分 1
653412Top
26 楼lEFTmOON(我的小站(www.ismyway.com))回复于 2004-11-04 14:40:54 得分 1
总感觉这些题没意思,除了考试,真正谁在开发时会这么写?
没哪个公司会在开发大型项目的时候会允许这样写代码吧?Top
27 楼jackyzgm()回复于 2004-11-04 14:43:54 得分 0
写着个代码呢,主要是加深static和对象实例化过程的理解,相关知识点相信在其它地方也有用到。当然了,实际项目不会头脑发热写这个的。呵呵Top
28 楼jokerjava(冷血)回复于 2004-11-04 14:44:30 得分 0
1 4 优于 2 好像是跟编译器有关
他们都在构造函数中执行Top
29 楼treeroot(旗鲁特)回复于 2004-11-04 14:45:41 得分 0
^_^Top
30 楼hahastone()回复于 2004-11-04 14:46:29 得分 0
563214Top
31 楼treeroot(旗鲁特)回复于 2004-11-04 14:46:59 得分 0
1 4 优于 2 好像是跟编译器有关
他们都在构造函数中执行
应该和编译器无关,不是在构造函数中执行,而是在构造函数前执行Top
32 楼jokerjava(冷血)回复于 2004-11-04 14:52:46 得分 0
是这样执行的
Test2()
{
System.out.print("1");
System.out.print("4");
System.out.print("2");
}Top
33 楼zcjl()回复于 2004-11-04 14:57:00 得分 0
不是在构造函数中执行,而是在构造函数前执行
------------------
那父类的构造器呢?应该在子类的构造器内还是先于子类的构造器?Top
34 楼jokerjava(冷血)回复于 2004-11-04 15:01:39 得分 0
构造器中
只不过排在了所有语句的前面Top
35 楼learnner( )回复于 2004-11-04 15:04:03 得分 0
惭愧Top
36 楼treeroot(旗鲁特)回复于 2004-11-04 15:08:18 得分 0
那父类的构造器呢?应该在子类的构造器内还是先于子类的构造器?
当然是先于子类构造器了,子类都回调用父类构造器.
Test2()
{
System.out.print("1");
System.out.print("4");
System.out.print("2");
}
不如这样理解
private int NULL=init();
private init(){
System.out.print("1");
System.out.print("4");
}
难道这个也是在构造中里面执行
Top
37 楼treeroot(旗鲁特)回复于 2004-11-04 15:10:02 得分 0
static{
} //是静态初始化
{
} //就是实例初始化,怎么可以说实例初始化在构造器中执行呢?Top
38 楼treeroot(旗鲁特)回复于 2004-11-04 15:14:04 得分 0
举一个最通俗的写法:
private int i=10
等价于:
private int i;
{
i=10;
}
这个应该好理解了吧,是在构造器中吗?
对于静态变量我们这种写法比较常见
private Map m;
static{
m=new HashMap();
m.put(...);
m.put(...);
}
而对于实例变量一般都会把这种初始化写道构造函数中去!
Top
39 楼jokerjava(冷血)回复于 2004-11-04 15:18:08 得分 0
private int NULL=init();
private init(){
System.out.print("1");
System.out.print("4");
}
对编译器来说 等价于下面的
private int NULL;
public Test(int i)
{
this.i = 0;
NULL = init();
}
public Test()
{
i = 0;
NULL = init();
}
Top
40 楼xiaohaiz(城里的老土,两眼依然通红!)回复于 2004-11-04 15:18:49 得分 0
635142
(1) 虚拟机试图加载Test2,其父类为Test1
(2) 虚拟机加载Test1
(3) Test1静态初始化 -----> 输出"6"
(4) 虚拟机加载Test2
(3) Test2静态初始化 -----> 输出"3"
(5) new Test2()构造Test2首先构造父类Test1
(6) Test1构造 -----> 输出"5"
(7) Test2执行初始化语句块(虚拟机调用Test2初始化方法init) -----> 输出"1"和"4"
(8) Test2构造 -----> 输出"2"Top
41 楼janicen(追忆)回复于 2004-11-04 15:20:55 得分 0
653142Top
42 楼zcjl()回复于 2004-11-04 16:03:04 得分 0
其实我全部的疑问都在于:
子类的构造器应该调用父类的构造器,即
public Test2() {
super();
System.out.print("2");
}
这里的super()到底是在子类的构造器内还是在构造器外?
我本来以为是在构造器内,而类的初始化块要先于构造器执行,所以顺序会是1452
但答案却是5142
这样的话,要么类的初始化块是在构造器内执行的,即是:
public Test2() {
super();
{
System.out.print("1");
}
{
System.out.print("4");
}
System.out.print("2");
}
要么父类的构造器是在子类的构造器外,且还要先于子类的初始化块被执行
不知道这两种可能的情况中,到底哪种才是正确的解释?Top
43 楼zcjl()回复于 2004-11-04 16:05:03 得分 0
在debug的时候,程序是先进入Test2构造器,执行super()
接着跳出构造器,依次执行
System.out.print("1");
System.out.print("4");
再转回构造器,执行
System.out.print("2");Top
44 楼treeroot(旗鲁特)回复于 2004-11-04 16:07:45 得分 0
我认为是第二种解释比较合理,因为整个过程是这样的
1.初始化父类实例变量
2.调用父类构造器
3.初始化子类实例变量
4.调用子类构造器
很明显父类构造器不可能在子类内执行吧,你把2放到4中,那么2也要放到4中
同理1也要放到2中,那不是都在4中了!Top
45 楼zxs790501(沧海一粟)回复于 2004-11-04 16:51:21 得分 0
好贴,复习一下,^_^Top
46 楼xiaohaiz(城里的老土,两眼依然通红!)回复于 2004-11-04 17:06:59 得分 0
俺来回答 zcjl() 的疑问,解释下这个调用的顺序。其实并不是什么先跳出constructor或者再进入constructor之类的问题。
如果一个类有初始化语句(非静态),在编译的时候,编译器会为其产生一个init方法,这个init方法会在当此类被构造的时候由虚拟机调用。init方法最开始的指令就是执行父类的init方法。这样就保证了父类会先于子类被构造。
将就楼主的 Test1和Test2 举例子看:
现看Test1:
===========================
Test1();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #3; //String 5
9: invokevirtual #4; //Method java/io/PrintStream.print:(Ljava/lang/String;)V
12: return
这段就是Test1的init方法,它首先会执行其父类Object的<init>
下面再看Test2:
===========================
Test2();
Code:
0: aload_0
1: invokespecial #1; //Method Test1."<init>":()V
4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #3; //String 1
9: invokevirtual #4; //Method java/io/PrintStream.print:(Ljava/lang/String;)V
12: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
15: ldc #5; //String 4
17: invokevirtual #4; //Method java/io/PrintStream.print:(Ljava/lang/String;)V
20: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
23: ldc #6; //String 2
25: invokevirtual #4; //Method java/io/PrintStream.print:(Ljava/lang/String;)V
28: return
这是Test2的init,1: invokespecial #1; //Method Test1."<init>":()V <-它首先会执行其父类Test1的<init>
看完这个,大家应该了解了吧。Top
47 楼zcjl()回复于 2004-11-04 17:51:51 得分 0
这么说,那应该是第一种解释才对
在对父类的init是在构造器Test2()中调用的
而原本写在构造器外面的初始化块System.out.print("2")和System.out.print("4")在编译成bytecode后被放在构造器里面Top
48 楼xiaohaiz(城里的老土,两眼依然通红!)回复于 2004-11-04 18:07:36 得分 0
嗯,对了。初始化语句一定会被放在对父类init之后才会被执行的。
那么有多个constructor的情况如何呢?比如我们看这个类:
public class A {
private int i;
private int j = 1;
public A() {}
public A(int i) {this.i=i;}
}
那么你说对Object的init应该是在A()中调用还是A(int)中调用呢?
我们现看A.class的字节码:
<<
public class A extends java.lang.Object{
public A();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2; //Field j:I
9: return
public A(int);
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2; //Field j:I
9: aload_0
10: iload_1
11: putfield #3; //Field i:I
14: return
}
>>
可以看到在两个构造A()和A(int)中,都会调用其父类的init.而对于私有成员j的初始化,在A()和A(int)都会有相应的语句:
<<
4: aload_0
5: iconst_1
6: putfield #2; //Field j:I
>>Top
49 楼xiaohaiz(城里的老土,两眼依然通红!)回复于 2004-11-04 18:10:17 得分 0
另外,看看A(int)的字节码顺序就确认其构造顺序是:
(1) 构造父类(0 ~ 1)
(2) 初始化成员(4 ~ 6)
(3) 执行构造方法的代码(9 ~ 11)Top
50 楼ronaldoaccp(RONALDO)回复于 2004-11-04 19:44:49 得分 0
635142Top
51 楼dxj1234(Kindly⊙Wolf)回复于 2004-11-04 20:09:15 得分 0
顶了以后看
Top
52 楼mmlovegg(java是一种信仰)回复于 2004-11-04 20:15:24 得分 0
365124
我都头晕了,错了不要批评我Top
53 楼Ranma_True(乱马1/2(真))回复于 2004-11-04 20:47:46 得分 0
markTop
54 楼classjava(原始野人)回复于 2004-11-04 21:01:02 得分 0
653142Top
55 楼classjava(原始野人)回复于 2004-11-04 21:05:09 得分 0
哎,错在原来要父类的和子类的static都初始化完,
不过偶还是蛮行的Top
56 楼kekai(枫)回复于 2004-11-04 21:16:57 得分 0
653142Top
57 楼chenxb1980(倾听)回复于 2004-11-04 21:50:18 得分 0
631452Top
58 楼chenxb1980(倾听)回复于 2004-11-04 21:52:34 得分 0
635142Top
59 楼csbemail(踏雪无痕)回复于 2004-11-04 23:10:49 得分 0
635142,应该没有错。Top
60 楼system1982(sam)回复于 2004-11-04 23:29:48 得分 0
同上...........Top
61 楼system1982(sam)回复于 2004-11-04 23:30:22 得分 0
只要看过thinking in java的人都应该知道的...Top
62 楼zouyiyy(靠JAVA混口饭吃)回复于 2004-11-04 23:36:43 得分 0
只知道static是在类构造前出现,继承的情况下还真不清楚哦。。。Top
63 楼prcgolf(小鸟)回复于 2004-11-05 09:20:45 得分 0
upTop
64 楼hvbird(天草翔伍)回复于 2004-11-05 09:36:10 得分 0
这样的讨论我觉得挺不错的,希望高手们就这样帮助初学者!~Top
65 楼linuxbing(翅膀)回复于 2004-11-05 09:45:55 得分 0
不错啊不错!!!学习Top
66 楼wlp_8228(大鹏)回复于 2004-11-05 10:13:20 得分 0
6 3 5 1 4 2Top
67 楼keithhe(边缘地带)回复于 2004-11-05 10:40:29 得分 0
68 楼zzzxxxcccvvv(zxc)回复于 2004-11-05 12:37:13 得分 0
@@Top
69 楼xiang0457(大个)回复于 2004-11-05 12:57:14 得分 0
j!!!!!!!!!!!!!!!!!!!!Top
70 楼xiang0457(大个)回复于 2004-11-05 12:58:26 得分 0
ding!!!!!!!!!!!!!!!!!!!!!Top
71 楼whbxm2000(学星,向星,摘星,披星)回复于 2004-11-05 13:10:04 得分 0
..Top
72 楼shaokun305(好好学习,天天向上。)回复于 2004-11-05 13:28:11 得分 0
不错,受益匪浅啊,学习.
这些乱七八糟的构造顺序确实不好搞明白.今天算是学习了一把.Top
73 楼newhandtoo(停留卡)回复于 2004-11-05 14:15:53 得分 0
阅Top
74 楼Tianminghui(colin)回复于 2004-11-05 14:37:25 得分 0
理解概念还可以,真正的用的了先后关系说明这个类设计失败了,面向对象不是自己内部复杂的对象Top
75 楼fanglifeng(tony)回复于 2004-11-05 16:34:56 得分 0
2 3Top
76 楼killua9797(自分で決めた道だから、たとえ失敗しても後悔しない。)回复于 2004-11-05 16:56:14 得分 0
think in java 中讲过初始化顺序的。Top
77 楼lzqcsdn(york)回复于 2004-11-05 16:57:58 得分 0
635142.ok!Top
78 楼shenghw(阿伟)回复于 2004-11-05 17:13:04 得分 0
为了大家可以时实共同交流
我创建了网络开发群:6838001Top
79 楼mahf(男男)回复于 2004-11-05 17:36:19 得分 0
635142 呵呵Top
80 楼Daem0n(瓶中的精灵)回复于 2004-11-05 17:40:42 得分 0
653142
错了~`Top
81 楼dyhml(VirusCamp)回复于 2004-11-06 10:58:51 得分 0
635142Top
82 楼Paolo_W(Paul)回复于 2004-11-06 13:52:19 得分 0
学习中!!!Top
83 楼jkwq(御往何处)回复于 2004-11-06 14:55:43 得分 0
有点技术含量,,,
635142Top
84 楼peterbarry(游戏人间)回复于 2004-11-06 15:24:09 得分 0
我的答案是653142, 我不明白为什么3 会在5的前面啊,不是先执行父类再执行子类的吗??请楼主和朋友们给出标准答案!!!Top
85 楼Squall1009(钰枫)(找工作ing)回复于 2004-11-06 18:20:51 得分 0
653142Top
86 楼javer219(javer219)回复于 2004-11-06 21:15:32 得分 0
635142
Top
87 楼weicanwuxin(weicanwuxin)回复于 2004-11-07 01:42:22 得分 0
651432Top
88 楼hs_ok(小科)回复于 2004-11-07 15:24:40 得分 0
先有父类,后有子类,先有类,后有对象,Static的东东是属于类的,new对象时先父类的构造函数(如果你没有显式的调用父类的构造函数,它会帮你加上的,如果你调用了父类的构造函数,它就不帮你加了),后子类的构造函数,构造函数时,先类的初始化,后类的构造函数。
635142(非显式调用父类的构造函数)
6375142(显式调用父类的构造函数)Top
89 楼yocean0416()回复于 2004-11-07 15:42:01 得分 0
我会,谢谢楼主出这么好的题Top
90 楼Mailbomb(网络咖啡http://blog.csdn.net/mailbomb)回复于 2004-11-07 15:45:25 得分 0
有难度Top
91 楼IceCraft(心淡情浓)回复于 2004-11-07 16:56:22 得分 0
12345Top
92 楼IceCraft(心淡情浓)回复于 2004-11-07 16:56:34 得分 0
上山打老虎Top
93 楼IceCraft(心淡情浓)回复于 2004-11-07 16:56:50 得分 0
老虎不在家
下山打松鼠Top
94 楼jackyzgm()回复于 2004-11-08 13:42:57 得分 0
讨论差不多了,已经取得良好效果。结帖。前十名各得一分。Top
95 楼cywarson(阿胜)回复于 2004-11-15 19:39:08 得分 0
Mark..Top
96 楼liuhualiang(eppen)回复于 2004-11-16 12:12:23 得分 0
markleTop
97 楼yhjf2004(雁回九峰)回复于 2004-11-16 15:04:10 得分 0
562314Top
98 楼superxiumu(好好学习,天天向上!)回复于 2004-11-18 21:55:00 得分 0
markTop
99 楼hjh_0791()回复于 2004-11-23 22:21:38 得分 0
等几天回答。学习去Top
100 楼gougou606(狗狗)回复于 2004-11-24 13:09:18 得分 0
很好啊 !!!!!!!!!111Top
101 楼libbyls1982(抬头见屋檐)回复于 2004-11-24 13:39:15 得分 0
6 3 5 1 4 2
没错吧Top
102 楼perfectfan911(Ace Programmer)回复于 2004-11-27 12:50:24 得分 0
好像Thinking in Java 讲过Top
103 楼Denie_11(琪)回复于 2004-11-28 17:20:42 得分 0
635142 是不是 ?
首先是静态父类静态、接着是非静态循序、构造,继承按类父类到子类的循序。
Top
104 楼naxin(痴呆男人--我痴呆,我自豪!!)回复于 2004-11-29 01:47:57 得分 0
markTop
105 楼wxok(阿昕)回复于 2004-12-02 16:42:13 得分 0
635142Top
106 楼sunhanjing305(浪里风雨)回复于 2004-12-06 17:50:07 得分 0
635142Top
107 楼liushiyu(▲开口的活鱼▲)回复于 2004-12-09 21:39:02 得分 0
]]>
</Content>
<PostDateTime>2004-11-4 13:56:16</PostDateTime>
</Reply>Top
108 楼flying2(飞天2号)回复于 2004-12-10 12:41:52 得分 0
mark
Top
109 楼jhkmnm()回复于 2004-12-11 11:07:06 得分 0
1,3,4Top
110 楼jhkmnm()回复于 2004-12-11 11:20:39 得分 0
晕啊,搞得我头大
应该是:6,3,5,2,1,4吧Top
111 楼allen_t(arccos(sinx))回复于 2004-12-13 00:17:38 得分 0
653214Top
112 楼superb_aby(蔓延)回复于 2004-12-15 13:17:39 得分 0
好
顶
不过根据第一个的‘经验’ 做第二个,居然错了Top
113 楼xhmerry(光军)回复于 2004-12-16 14:38:41 得分 0
晕
确实有点难度啊~~~~~~~~~~~~Top
114 楼baselive(静默)回复于 2004-12-17 09:44:15 得分 0
怎么14会在2之前,各位能不能给个答案????Top
115 楼superryu(龙)回复于 2004-12-17 15:53:25 得分 0
确实很晕啊Top
116 楼mlac()回复于 2005-01-13 09:36:35 得分 0
Test2: 6 3 5 1 4 2
Test3: 6 3 7 5 1 4 2
Test: 0 30 40Top




