JavA持有类_关于继承:Java持有对象的超类的类型
本問題已經有最佳答案,請猛點這里訪問。
我有兩個類動物和狗。因為你可以從動物身上延伸出來。我可以毫無問題地編寫這些類,但我注意到我可以像這樣創建一個新的dog對象:
Dog firstDog = new Dog("rocky");
沒關系,但是當我嘗試創建這樣的新實例時:
Animal secondDog = new Dog("alex");
沒有任何錯誤,但我無法訪問我在Dog類中編寫的任何字段或方法,即使它們是公共的,所以如果我想在一個類型與其超類的類型相同的變量中保存一個對象,我可以到達字段和僅實現超類的方法(對于此示例名稱,顏色,setColor()和toString()),并且沒有任何方法可以訪問在子類中實現的字段和方法。我是否正確理解當我嘗試調用secondDog的toString()函數時它調用我在Dog類中編寫的方法,我知道我在Dog類中重寫了這個函數但是我無法達到我在Dog類中實現的其他方法。 java如何處理這些?
動物類:
public class Animal {
private String name;
private String color;
public Animal(String name){
this.name=name;
}
public void setColor(String color){
this.color=color;
}
public String toString(){
return"Hi, my name is" + this.name +". I'm" + this.color;
}
}
狗類:
public class Dog extends Animal {
private int age;
public Dog(String name){
super(name);
setColor("gray");
this.age = 7;
}
public String speakDog(){
return"wof!";
}
public String toString(){
return super.toString() +" and I" + speakDog();
}
}
Can java可能重復調用其他對象中的父重寫方法但不是子類型?stackoverflow.com/questions/10985223/java-polymorphism
當你寫這個:
Animal secondDog = new Dog("alex");
你告訴Java secondDog是Animal,就是這樣。您被允許將Dog分配給Animal引用的原因是因為Dog是Animal的子類,因此允許它。
但是,顯式為Animal的secondDog只能訪問Animal類的屬性和行為。
要訪問Dog的屬性和行為,您需要強制轉換它:
((Dog)secondDog).speakDog();
將它轉換為Dog就像告訴Java:"嘿,相信我。這個對象是狗"。
現在只有更具體,您才可以訪問狗的屬性。 (如果沒有,它仍然被視為動物(更高級))。
但是,如果將其強制轉換為不是Animal的子類的類,則會得到ClassCastException。
在本質上,
如果secondDog保持為Animal(未被轉換為Dog),則它只能訪問Animal中的所有非私有字段和方法。
如果secondDog被轉換為Dog,它可以從Animal訪問所有繼承的字段和方法以及Dog中的所有非私有字段和方法。
是的我明白。 當我沒有投放到Dog時,我只能訪問Animal的所有非私有字段和方法。 但是如果我在Dog類中覆蓋其中一個方法,我會在主函數中得到覆蓋的一個嗎?
@azuosxela你是對的,它被重寫的方法,你將在子類中調用重寫的方法。 例如,如果你做System.out.println(secondDog); (即使沒有強制轉換),它也會從Dog類調用toString()。
不,不可能通過Animal類訪問Dog的屬性。考慮許多子類流動的基礎對象"對象"。
你可以說JFrame frame = new JFrame(");
要么
Object objFrame = new JFrame(");
幀。???將允許您訪問所有JFrame的屬性
objFrame。???只會讓您訪問Object的屬性。
我不敢問為什么secondDog應該被創建為動物而不是狗:)
施放Animal對象以顯示它是一只狗
Dog secondDog = (Dog) new Animal("alex);
看看這個:
Animal a = new Dog();
Dog d = (Dog) a; // no problem, the type animal can be casted to a dog, because its a dog
Cat c = (Dog) a; // raises class cast exception, you cant cast a dog to a cat
僅在它是子類時才轉換。
充分尊重; 這完全是胡說八道。 關鍵是你告訴java編譯器secondDog的類型是Animal。 動物是一種動物; 而不是狗。 額外的演員陣容不會改變任何東西(在這種情況下)。 當然,當你知道你的動物是一只狗時,你可以把動物送到狗; 并使用狗的方法。 但這不是你的代碼正在做的事情。
總結
以上是生活随笔為你收集整理的JavA持有类_关于继承:Java持有对象的超类的类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移民美国需要多少钱啊?
- 下一篇: 做第一代试管婴儿需要满足什么条件?