1. 程式人生 > >java 通過子類怎麼呼叫父類已經被重寫的方法

java 通過子類怎麼呼叫父類已經被重寫的方法

= =今天看書看到覆蓋和過載

我就在想能不能再例項化的子類中呼叫父類已經被覆蓋的方法

百度了很久

除了說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的最初設計意圖之一。 

大多數時候,覆蓋父類意味著子類想做些特殊的處理。如果能夠跳過子類的特殊處理,就會開啟一個無法控制的缺口,會導致很多很多問題。 

唯一可以呼叫父類方法的地方,就只有類內部。子類自己控制,什麼時候該呼叫父類,什麼時候做自己的處理。
想到最後才發現自己為啥會糾結這麼一個問題=。=
方法被覆蓋自然是需要修改
既然修改了為什麼還要想著去呼叫父類中的方法
真是多此一舉