了解Java继承:奇怪的行为

时间:2014-11-04 10:58:51

标签: java inheritance

我不理解类继承的奇怪行为。

这是我的父类:

public class Cubetti implements Token{
   ...
    private int id=1;
   ...
    public Cubetti(int n) {
        numero = n;
    }
   ...
    public int getId() { return id; }
    public void setId( int idx) { id = idx; }
   ...
}

这是子类:

public class RGC extends Cubetti{
    private int id=0;
   ...
    public RGC (int idx) { 
        super(0);
        id = idx; // STRANGE BEHAVIOUR !
    }
   ...
}

这是测试主类:

public static void main(String[] args) {

        RGC uno = new RGC(1);
        RGC due = new RGC(2);

        System.out.println(" uno Id is  " + uno.getId() + " due Id is" + due.getId());

 }

输出

  

Uno Id为1,到期Id为1

但如果我在RGC子类的标记行中使用:

....
// id = idx;
setId(idx);
....

输出

  

Uno Id为1,到期Id为2

为什么?

2 个答案:

答案 0 :(得分:3)

id超类和Cubetti子类中都有一个RGC变量。使用setter和getter更新/返回超类的id,因为这些方法是在超类中定义的,并且不会被子类覆盖。

在子类构造函数中调用id = idx修改子类的变量,因为子类的变量隐藏了超类的变量,即使它没有隐藏它,你也不会能够从子类访问它,因为它是私有的。

答案 1 :(得分:0)

在Java中 ::
私有属性不会继承到派生类。因此,在Cubetti类的范围内看不到RGC的私有财产(可直接访问)。 Cubetti的id属性只能通过外部世界使用get()& set()方法(如果这些方法被声明为public)。

在第一种情况下,您的输出如下:
Uno Id is 1 and due Id is 1
原因是,Cubetti' getId()& setId()方法继承RGC类,因为它们是Cubetti类的公共方法。因此,无论何时调用get()方法,您都会获得Cubetti的id值的值,该值设置为1。这就是为什么你得到1&的价值Uno的原因。 Due

在第二种情况下:
您将setId()放在RGC构造函数中。在这里,您基本上设置了Cubetti ID的ID。因此,正在返回getId() id的{​​{1}}。