class B{
private int radius = 10;
public void draw(){
System.out.println("B.draw(),radius = "+radius);
}
public B(){
System.out.println("B constructor");
draw();
}
}
public class A extends B{
private int radius = 1;
public void draw(){
System.out.println("A.draw(),radius = "+radius);
}
public A(int radius){
this.radius = radius;
System.out.println("A constructor");
}
public static void main(String[] args){
A a = new A(5);
}
}
运行结果是
B constructor
A.draw(), radius = 0
A constructor
对于这个程序的运行顺序我觉得 :运行A a = new A(5);时,程序开始执行
public A(int radius){
this.radius = radius;
System.out.println("A constructor");
}
这个方法体,此时会调用父类的构造方法
打印B constructor,然后运行父类的draw()方法,由于子类重写了draw()方法,会执行System.out.println("A.draw(),radius = "+radius);这一句,但是打印结果却是A.draw(), radius = 0。我实在是想不明白。
为什么radius的值不是 1 或者5 或者10 呢?
private int radius = 1;//"=1" 就是误导人的,赋不赋值都无所谓的,已经被private修饰了,外部不能直接拿到radius,需通过构造方法public A(int radius)给radius传int类型的参数值获取。 作者: 周刚 时间: 2012-7-4 22:24
我也觉得很奇怪,父类构造函数中调用draw方法,这本来就是一件奇怪的事,更奇怪的是,它又跑去调用子类的draw方法去了,这里面的参数赋值
会经历怎样的情况呢?我不清楚。但至少我不会去写这么令我迷惑的代码。建议不要在构造方法里面调用成员函数吧!!!!这样会出问题的。改成
下面这种形式,一切都正常了!!!
class B {
private int radius = 10;
public void draw() {
System.out.println("B.draw(),radius = " + radius);
}
public B() {
System.out.println("B constructor");
}
}
public class A extends B {
private int radius = 1;
public void draw() {
System.out.println("A.draw(),radius = " + radius);
}
public A(int radius) {
this.radius = radius;
System.out.println("A constructor");
}
public static void main(String[] args) {
A a = new A(5);
a.draw();
}
}
执行结果如下:
B constructor
A constructor
A.draw(),radius = 5 作者: 任文杰 时间: 2012-7-4 22:36
通过各位的回答,我总结一下:
1、子类B继承父类A,在实例化子类B的过程中,先调用父类A无参的构造方法,然后再调用子类B具体的(根据参数个数和类型)构造方法。
2、如果子类B继承父类A的方法,则将调用子类B重写父类A的方法。
3、类实例化的过程中,调用成员方法时,如果成员方法访问类的相关属性就会得到默认初始化值(类静态成员除外)。作者: 赵庆礼 时间: 2012-7-4 22:43
class B{
private int radius = 10;
public void draw(){
System.out.println("B.draw(),radius = "+radius);
}
public B(){
System.out.println("B constructor");
draw();
}
}
public class A extends B{
private int radius = 1;
public void draw(){
System.out.println("A.draw(),radius = "+radius);
}
public A(int radius){
this.radius = radius;
System.out.println("A constructor");
}
public static void main(String[] args){
A a = new A(5);//当执行A a = new A(5);时,因为类A继承类B,所以先执行类B的构造函数,
//由于类A重写了B中的draw方法,所以执行类A中的draw,而类A还没有被初始化,
//radius还没有被赋值,所以radius为默认值0.
}
}
代码中的红体字为解释