Topic: 为什么这个程序的执行结果是0,4,3?!

  Print this page

1.为什么这个程序的执行结果是0,4,3?! Copy to clipboard
Posted by: allmylove
Posted on: 2005-10-19 04:51

class A {
public void m() { }
public A() {
m();
}
}
class B extends A {
private int f = 4;
public void m() {
System.out.println ( f );
}
public B() {
m();
f = 3;
m();
}
}
public class Init {
public static void main(String[] args) {
B b = new B();
}
}

JAVA中CALL 默认的CONTRATOR都要CALL SUPER一次吗?

2.Re:为什么这个程序的执行结果是0,4,3?! [Re: allmylove] Copy to clipboard
Posted by: hxz5830
Posted on: 2005-10-19 08:55

class A {
public void m() { }
public A() {
m();//被B类中m()覆盖,调用的是B类中m();B类中f尚没初始化,默认0;故第一个结果为0
}
}
class B extends A {
private int f = 4;
public void m() {
System.out.println ( f );
}
public B() {
m();
f = 3;//局部变量覆盖类变量; 对不起,说错了 应该是类变量f重新赋值
m();
}
}
public class Init {
public static void main(String[] args) {
B b = new B();//首先调用父类构造函数
}
}

JAVA中CALL 默认的CONTRATOR都要CALL SUPER一次吗?

3.Re:为什么这个程序的执行结果是0,4,3?! [Re: hxz5830] Copy to clipboard
Posted by: allmylove
Posted on: 2005-10-19 09:21

hxz5830 wrote:
class A {
public void m() { }
public A() {
m();//被B类中m()覆盖,调用的是B类中m();B类中f尚没初始化,默认0;故第一个结果为0
}
}
class B extends A {
private int f = 4;
public void m() {
System.out.println ( f );
}
public B() {
m();
f = 3;//局部变量覆盖类变量
m();
}
}
public class Init {
public static void main(String[] args) {
B b = new B();//首先调用父类构造函数
      //??为什么要调用父类构造函数,而不调用自己现有的构造函数?
}
}

JAVA中CALL 默认的CONTRATOR都要CALL SUPER一次吗?

4.Re:为什么这个程序的执行结果是0,4,3?! [Re: allmylove] Copy to clipboard
Posted by: hxz5830
Posted on: 2005-10-19 09:40

父类构造函数不能覆盖和隐藏. 新建一个子类对象时,首先调用父类构造函数.这是子类对象的初始化顺序

5.Re:为什么这个程序的执行结果是0,4,3?! [Re: allmylove] Copy to clipboard
Posted by: allmylove
Posted on: 2005-10-19 12:02

不胜感激,现在明白了!就是相当与1+1=2?规则

6.Re:为什么这个程序的执行结果是0,4,3?! [Re: allmylove] Copy to clipboard
Posted by: linjie1918
Posted on: 2005-10-19 22:30

谢谢,我现在也明白了。。。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923