[英]How does upcasting actually works in java
我有 3 個類,其中一個是super class
,另外兩個是sub classes
。 它們具有通用的print()
方法。 在從main()
調用print()
方法時,我已將對象向上轉換為super class
那么它不是必須調用super class
方法而不是subclasses
。 我在這里有點困惑。 這怎么可能? 在java中是否有這種行為的任何原因。
這是我的代碼
class Tree {
public void print() {
System.out.println("I am Tree");
}
public static void main(String []args) {
Tree t[] = new Tree[3];
t[0] = new Tree();
t[1] = new BanyanTree();
t[2] = new PeepalTree();
for(int i = 0; i < 3; i++) {
((Tree)t[i]).print();
}
}
}
public class BanyanTree extends Tree{
public void print() {
System.out.println("I am BanyanTree");
}
}
public class PeepalTree extends Tree{
public void print() {
System.out.println("I am PeepalTree");
}
}
程序的輸出是
I am Tree
I am BanyanTree
I am PeepalTree
在我看來,輸出應該是
I am Tree
I am Tree
I am Tree
我在這里遺漏了什么???
這稱為多態性。 該方法采用相同的類型(無)、相同的返回類型(void)和相同的名稱(打印)。 因此,當您調用 print 方法時,它會調用最專業的(繼承樹中最低的方法)。 有一種東西叫做他們認為對象是什么以及它到底是什么。 他們認為它是一棵樹,但實際上是一棵榕樹。 如果你向上投射它,它不會做任何事情,因為樹的數組使它認為它們是樹,如果你將它投射到一棵樹上,他們仍然認為它是一棵樹。 從技術上講,您將其轉換為完全相同的內容。 抱歉沒有在我的回答中包含這個。 當你創建一個新的 Tree 時,繼承結構是這樣的。
Object (Cosmic Super-class)
|
\ /
Tree
最專業的方法是樹。 但是,當您創建另一種類型的樹時,例如 BanyanTree,其結構如下所示。
Object
|
\ /
Tree
|
\ /
BanyanTree
最專業的打印方法來自 BanyanTree,因此它會執行該方法。 對不起,如果你不明白,這是一個非常復雜的話題。
如果DerivedClass
擴展BaseClass
和具有相同的名稱和它們的簽名的方法BaseClass
那么壓倒一切將發生在運行時多態性。 也不需要向上轉換,因為您已經將數組初始化為BaseClass[ ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.