不可靠的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子类可以将状态(变量)和行为(方法)添加到父类的状态(变量)和行为(方法)中。它还可以重写父类的行为(方法)(假设它们对于位于不同包中的父类不是私有的或包私有的)。但是,它不能重写父类的变量。如果它定义的变量与父类中的变量同名,则会隐藏它们。