簡體   English   中英

我應該使用靜態綁定嗎?

[英]Should I use static binding?

我正在學習后期綁定和靜態綁定。 現在我對這些代碼感到困惑。

以下是我的分析:

  1. hello()是非靜態方法,所以我們應該使用動態綁定,即Child。
  2. 但是子類中沒有hello()方法,所以轉到它的超類。 找到hello()並打印第一行“Hello from parent call calssMethod”。
  3. 由於classMethod()是靜態的,所以我們應該使用c的靜態綁定,也就是Child。 所以輸出是“classMethod in Child”。

所以輸出應該是

你好來自父調用 calssMethod

子類中的類方法

class Parent{
    public static void classMethod() {
        System.out.println("classMethod in Parent");
    }
    public void instanceMethod() {
        System.out.println("InstanceMethod in Parent");
    }
    
    public void hello() {
        System.out.println("Hello from parent call calssMethod");
        classMethod();
    }
}

class Child extends Parent{
    public static void classMethod() {
        System.out.println("classMethod in Child");
    }
    public void instanceMethod() {
        System.out.println("InstanceMethod in Child");
    }
}
public class AA {
    public static void main(String[] args) {
        Child c = new Child();
        c.hello();
    }
}

現在,問題來了。 IDE 顯示輸出為:

你好來自父調用 calssMethod

父類中的類方法

什么是正確的分析過程?

如果我將hello()方法設為靜態會怎樣?

每當我們調用子類的對象時,它總是首先找到父類並執行它。 由於您在兩個類中都有靜態 classMethod,因此它始終運行父類的 classMethod 而不是子類的。 您只能通過覆蓋它來獲得所需的答案。

如果您將 hello() 方法設為靜態,即使它也會為您提供相同的輸出。

類(靜態)方法不會被覆蓋為實例方法。 當您調用方法“hello()”時,它將使用父方法。 當您在那里引用類方法時,您指的是在類“Parent”中定義的方法。

除此之外,您應該將您的 Child 實例聲明為“Parent c = new Child()”。 因為您不是向子類添加新方法,而是更改實現,所以您不會失去對子類方法的訪問權限。 如果您必須使用返回 Parent 對象的方法,但返回一個像您一樣聲明的 Child 對象,則會遇到問題。

編輯:除此之外,使用繼承通常有兩個原因:專業化和擴展。

對於專業化,您可以在超類中定義您的方法,而您的子類在實現這些方法的方式上有所不同。 例如,帶有子類 Cat 和 Dog 的超類 Animal。 'Animal' 有一個方法makeSound() 您可以想象這兩個子類都有不同的實現。

對於擴展,您使用超類作為包含所有重疊內容的基類。 除此之外,子類可能有非常不同的實現和用途。 很多接口都有這種用途。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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