[英]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
原因是, Cubetti
的getId()
和setId()
方法繼承到RGC
類,因為它們是Cubetti
類的公共方法。 因此,每當調用get()
方法時,都會得到Cubetti
的id值的值,該值設置為1
。 這就是為什么你得到Uno
和Due
的值1
的Due
。
在第二種情況:
你將setId()
放在RGC
構造函數中。 在這里你基本上設置了Cubetti
ID的id。 因此,返回調用getId()
的Cubetti
的id
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.