[英]Should I use static binding?
我正在學習后期綁定和靜態綁定。 現在我對這些代碼感到困惑。
以下是我的分析:
hello()
是非靜態方法,所以我們應該使用動態綁定,即Child。hello()
方法,所以轉到它的超類。 找到hello()
並打印第一行“Hello from parent call calssMethod”。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.