2013-07-03 53 views
0
public class RectangleEx extends Rectangle 
{ 
    int height =0; 
    int width=0; 

    public RectangleEx(int height, int width) 
    { 
     super(height,width); 
    } 

    public RectangleEx() 
    { 
     super(0,0); 
     this.setHeight(5); 
     System.out.println(this.height); 
    } 
} 

谁能告诉我为什么,当使用第二个构造函数创建新的RectangleEx时,其高度为0而不是5?这是超类中setHeight的代码:子类设置方法不起作用

public void setHeight(int height) 
{ 
    this.height = height; 
} 
+0

来自超类的'height'与您继承的类的'height'不一样。 –

回答

1

这是由于实例变量隐藏。由于您已经在子类中声明了另一个具有相同名称的变量height,它隐藏了在超类中定义的变量。所以,当你访问变量时,使用this.height,这会给你在子类中定义的值height,它根本没有设置。

呼叫:

this.setHeight(5); 

调用超类,它设置在超级类本身高度的方法中,而

System.out.println(this.height); 

正在访问在RectangleEx限定,而不是Rectangleheight,这是仍然是0.

如果你想访问超类的height,defi ne a getter in super class,它将返回超类变量。

+0

只要不是'private' – DannyMo

+0

@damo,'super.height'也会工作。我不认为这是可行的。在私有变量的情况下,甚至不考虑成员隐藏,因为它们在课堂以外甚至不可见。隐藏适用于公共,受保护或包私有变量。 –

+0

等等...当我这样做.setHeight(5)时,我将SUPERCLASS的高度设置为5?但我甚至没有定义属于超类的对象!我很困惑。我认为子类的对象继承了set方法,而子类对象可以用this.method引用自己... –