簡體   English   中英

在 Java 中向上轉換實際上是如何工作的

[英]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.

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