簡體   English   中英

Undestanding Java Inheritance:奇怪的行為

[英]Undestanding Java Inheritance: strange behaviour

我不明白類繼承的奇怪行為。

這是我的父類:

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

為什么?

Cubetti超類和RGC子類中都有一個id變量。 使用setter和getter更新/返回超類的id ,因為這些方法是在超類中定義的,並且不被子類覆蓋。

在子類構造函數中調用id = idx會修改子類的變量,因為子類的變量隱藏了超類的變量,即使它沒有隱藏它,你也無法從中訪問它子類,因為它是私有的。

在Java ::
私有屬性不會繼承到派生類。 因此,在RGC班級的范圍內, Cubetti的私有財產並未被看到(可直接訪問)。 Cubetti的id屬性只能通過外部世界使用get()set()方法訪問(如果這些方法被聲明為public)。

在第一種情況下,您的輸出如下:
Uno Id is 1 and due Id is 1
原因是, CubettigetId()setId()方法繼承到RGC類,因為它們是Cubetti類的公共方法。 因此,每當調用get()方法時,都會得到Cubetti的id值的值,該值設置為1 這就是為什么你得到UnoDue的值1Due

在第二種情況:
你將setId()放在RGC構造函數中。 在這里你基本上設置了Cubetti ID的id。 因此,返回調用getId()Cubettiid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM