我正在學習后期綁定和靜態綁定?,F在我對這些代碼感到困惑。這是我的分析:hello()是非靜態方法,所以我們應該使用動態綁定,即Child。但是子類里面沒有hello()方法,就去它的父類。查找hello()并打印第一行“Hello from parent call calssMethod”。由于classMethod()是靜態的,所以我們應該使用c的靜態綁定,也就是Child。所以輸出是“child 中的 classMethod”。所以輸出應該是來自父調用 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()方法設為靜態怎么辦?
2 回答

www說
TA貢獻1775條經驗 獲得超8個贊
類(靜態)方法不會被重寫為實例方法。當您調用方法“hello()”時,它將使用父方法。當您在此處引用類方法時,您指的是在“Parent”類中定義的方法。
除此之外,您應該將您的 Child 實例聲明為“Parent c = new Child()”。因為您不是向子類添加新方法而是更改實現,所以您不會失去對子類方法的訪問權。如果您必須使用返回 Parent 對象的方法,但您返回的是像您一樣聲明的 Child 對象,則會遇到問題。
編輯:除此之外,通常有兩個使用繼承的原因:專業化和擴展。
對于專業化,您使用在超類中定義方法,而您的子類在實現這些方法的方式上有所不同。例如,具有子類 Cat 和 Dog 的超類 Animal。“動物”有一個方法makeSound()
。您可以想象這兩個子類將有不同的實現。
對于擴展,您使用超類作為包含所有重疊內容的基類。除此之外,子類可能有非常不同的實現和用途。很多接口都有這種用途。

不負相思意
TA貢獻1777條經驗 獲得超10個贊
每當我們調用子類的對象時,它總是首先找到父類并執行它。由于您在兩個類中都有靜態 classMethod,因此它始終運行父級的 classMethod 而不是子級的。您只能通過覆蓋它來獲得所需的答案。
如果你將 hello() 方法設為靜態,那么它也會給你相同的輸出。
添加回答
舉報
0/150
提交
取消