java 通過子類怎麼呼叫父類已經被重寫的方法
阿新 • • 發佈:2019-02-12
= =今天看書看到覆蓋和過載
我就在想能不能再例項化的子類中呼叫父類已經被覆蓋的方法
百度了很久
除了說super 貌似就不行了
也能在子類中做一個新方法來呼叫父類已經被覆蓋的方法
例如:
import java.io.BufferedReader; public class baidu extends Search { public static void main(String[] args) throws IOException { new baidu().superFunction() ; } public void function(){ System.out.println("I am baidu!"); } public void superFunction(){ super.function() ; } } class Search{ public void function(){ System.out.println("I am search!"); } }
也有人說
A為父類,B為子類,都有一個m()方法
B b = new B();
想通過((A)b).m()
來呼叫
實際上也是不行的
詳見見識:
B b=new B(); 這種方式,實際上是例項化了子類的物件,注意:記憶體中還是子類物件。 ((A)b).m(); 表面上看起來是父類物件了,但是由於記憶體中是子類物件,所以呼叫的還是子類方法。 A b=new B(); b.m(); 這種方法和你寫的實際是一個效果,雖然上溯造型到了父類,由於子類重寫了父類的方法,呼叫的還是子類的方法(也就是所:方法的實現,最後是在子類中實現的)。 所以,總結如下: 如果子類沒有重寫父類的方法,呼叫父類的方法的時候,實際上是去父類的記憶體中實現,可以呼叫父類方法。 如果子類重寫了父類的方法,那麼,你雖然上溯造型到了父類,由於記憶體還是子類,該方法的實現還是在子類,所以用例項化的物件是呼叫不到父類的,這種情況下,只能用super關鍵字。
綜上
如果不是類內部,而是外部呼叫,比如你例子中的main方法,答案是
不能。你不能呼叫已經被覆蓋掉的父類的方法。
這也是覆蓋override的最初設計意圖之一。
大多數時候,覆蓋父類意味著子類想做些特殊的處理。如果能夠跳過子類的特殊處理,就會開啟一個無法控制的缺口,會導致很多很多問題。
唯一可以呼叫父類方法的地方,就只有類內部。子類自己控制,什麼時候該呼叫父類,什麼時候做自己的處理。
想到最後才發現自己為啥會糾結這麼一個問題=。=
方法被覆蓋自然是需要修改
既然修改了為什麼還要想著去呼叫父類中的方法
真是多此一舉