不可靠的Java继承:奇怪的行为
我不理解类继承的奇怪行为 这是我的父类:不可靠的Java继承:奇怪的行为,java,inheritance,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 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 !
}
...
}
....
// id = idx;
setId(idx);
....
这是测试主类:
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
子类的标记行中使用:
public class RGC extends Cubetti{
private int id=0;
...
public RGC (int idx) {
super(0);
id = idx; // STRANGE BEHAVIOUR !
}
...
}
....
// id = idx;
setId(idx);
....
输出是
Uno Id为1,到期Id为2
为什么?您在
Cubetti
超类和RGC
子类中都有一个id
变量。使用setter和getter更新/返回超类的id
,因为这些方法是在超类中定义的,不会被子类覆盖
在子类构造函数中调用
id=idx
会修改子类的变量,因为子类的变量隐藏了超类的变量,即使它没有隐藏,您也无法从子类访问它,因为它是私有的。在Java中:私有属性不会继承到派生类。因此,
Cubetti
的私有财产在RGC
的类范围内不可见(直接可访问)Cubetti
的id属性只能通过外部世界使用get()
&set()
方法访问(如果这些方法被声明为公共的话)
在输出如下的第一种情况下:
Uno Id为1,到期Id为1
原因是,
Cubetti
的getId()
&setId()
方法继承给RGC
类,因为它们是Cubetti
类的公共方法。因此,无论何时调用get()
方法,都会得到Cubetti
的id值,该值设置为1
。这就是为什么您会为Uno
和Due
获得值1
在第二种情况下:
将
setId()
放置在RGC
构造函数中。在这里,您基本上设置了Cubetti
的id。因此调用getId()
将返回Cubetti
的id
。因为它被设计成每天都可以学习java和java概念的新东西。谢谢你的提问,顺便说一句,这不是一个奇怪的问题,而是正确的行为。编辑:评论的位置不对OK。也许我必须改进我的继承观念。我是一个老c程序员,几十年后我又开始从零开始学习编程了。。所以请对我耐心:)如果我错了,请纠正我:因为现在我认为子类是从父类获取模型的东西,但具有某种“形式”独立性。相反,我必须将子类实例视为具有更多内容的父类实例,因此当我定义子类行为时,我有一些严格的约束,我可以添加一些功能性,但不是很多more@IdoTraini子类可以将状态(变量)和行为(方法)添加到父类的状态(变量)和行为(方法)中。它还可以重写父类的行为(方法)(假设它们对于位于不同包中的父类不是私有的或包私有的)。但是,它不能重写父类的变量。如果它定义的变量与父类中的变量同名,则会隐藏它们。