java 方法继承方法_Java继承和方法重写
這是我在研究遺產(chǎn)時在網(wǎng)上找到的一個例子。
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal();
Animal b = new Dog();
a.move(); ? // runs the method in Animal class
b.move(); ? // runs the method in Dog class
}
}
我主要的困惑是主方法中的一行:Animal b = new Dog();
我明白 :
Animal是類名
b是對象引用
新的內(nèi)存分配
狗是建設(shè)者電話
但'b'在哪里提到的確切?
什么是Animal b = new Dog();在做什么?
如果Dog擴展Animal,為什么它Animal b = new Dog而不是Dog b = new Dog();?
如果我用Dog b = new Dog();替換該行,那么與Animal b = new Dog();的區(qū)別是什么
動物b =新狗()意味著,動物參考和狗對象?
b引用了Dog的實例,但是b在羊皮服裝中充當Animal ...狼的實例 - 歡迎使用多態(tài)
你為什么用Listlist = new ArrayList<>()?將代碼與特定實現(xiàn)分離。與動物和狗相同。當您的狗成為貓時,您的代碼中只需要進行一次更改,因為使用Animal仍然是正確的。
@MaccenWright這在內(nèi)部意味著什么?這個怎么運作?它引用Animal類并為dog類創(chuàng)建一個對象?我無法理解內(nèi)部發(fā)生的事情。
這是多態(tài)性和向上轉(zhuǎn)換。 Animal b = new Dog();這一行意味著你可以使用Animal類接口,你可以在編譯時使用Animals方法。但是在運行時Dog類的方法運行。
你應(yīng)該從現(xiàn)實生活的角度來看待它。你有一只動物狗。當你調(diào)用你的動物的聲音行為時,在這種情況下它是一只狗,它將返回"Aw aw aw"。如果你有動物貓,它會說"喵"。
Animal b;
聲明一個名為b的變量,用于存儲Animal對象。 Dog是Animal的一種嗎?是。所以狗可以放入b。完全沒問題。
If Dog extends Animal, why is it Animal b = new Dog and not Dog b = new Dog();
沒有明顯的理由,如果這是所有的代碼。編寫代碼的人認為,讓我們這樣做,所以他做到了。
給定更多上下文,編寫代碼的人可能希望稍后存儲其他動物,例如Cat。如果他宣稱它像Dog b,他以后就不能在其中存儲Cat。
另一個原因可能是只展示多態(tài)性。它證明了"是的,你確實可以將狗分配給動物變量。這是因為Dog擴展了Animal!"
那么Animal b和Dog b之間有什么區(qū)別?
使用當前代碼,沒有區(qū)別。但是如果你在Dog中聲明了更多的成員,你會看到差異。我們在Dog中編寫了一個名為bark的方法。使用Animal b,您無法訪問bark,但使用Dog b,您可以。這是因為對于前者,編譯器認為b是Animal,而不是Dog。 (實際上,這很難)
你需要更多地注重良好實踐,比如編程到接口和松散耦合,而不是說"沒有明顯的理由,如果這就是所有的代碼"。 否則很好解釋。
使用Dog b = new Dog()沒有任何問題。
這只是創(chuàng)建一個Dog對象。
現(xiàn)在,
Animal a = new Animal();
動物b =新狗();
對象b即使具有Animal引用,Dog對象也會在運行時創(chuàng)建。所以基本上你可以使用超類引用來實例化子類對象。因此,這僅用于顯示方法覆蓋,因為您可以使用超類引用調(diào)用子類方法"move"。
"="的左手表示變量"b"的聲明類,右手是精確的類。
Class Dog擴展了Animal類,一個變量可以聲明為父類,并由子類實現(xiàn)。
運行下面的代碼,你可以得到"真實"。
System.out.println(b instanceof Animal); //真正
System.out.println(b instanceof Dog); //真正
總結(jié)
以上是生活随笔為你收集整理的java 方法继承方法_Java继承和方法重写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中field的覆写_Java中方
- 下一篇: 2019年JAVA比较火的框架_2019