我不理解类继承的奇怪行为。
这是我的父类:
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
为什么?
答案 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}}。