Java中的重寫覆蓋問題

2021-06-26 23:31:30 字數 1037 閱讀 8205

1. 首先,重寫等於覆蓋,常發生於父類與子類之間的變數和方法之間。

2. 重寫,在執行期間採用多型的形式。

3. 重寫的方法不能比被重寫的方法有跟高的訪問許可權和更多的異常。

4.成員變數的重寫與方法的重寫是不同。覺得這裡可以用c++的語言進行解釋:父類的成員變數被繼承後並重寫,其依然存在與子類之中,而子類重寫的變數也是存在的,只是他們各自相對與類首位址的偏移量不同。這個偏移量在每個類中都是一樣,可以存在類中。

以上a,b類為例,子類b中的成員變數安排依次是str=father,size= 20,str=son,size=10.這樣可以保證子類向上轉換時資訊不丟失。其實並不算是重寫,而是變數的堆疊。但是方法的重寫機制感覺有點不同,記憶體中找到方法的實際是按照其入口位址進行對應的,例如,a類中getstr方法有乙個入口位址a-addr, b類方法getstr也有乙個入口位址b-addr,這個入口位址存在與具體例項化的物件中。

5. 按照以上方式去理解的話,下面的**就較為容易的知道執行結果了。

前兩個自不必多說,說說最後兩個輸出。aa.getstr()方法的入口位址存在與new b()的新物件內,這個方法入口位址是永遠不變的,自然就是b類中的getstr()方法,也就是所謂重寫的方法。而aa.size的值,按照上面的說法,是以類的偏移位址尋找,類是a類,size自其首位址會偏移str="father"這麼多個位元組(具體多少位元組也不知道,感覺應該是指標4個位元組的樣子,暫時就這麼記吧),按照這個偏移量後,自然找到size=20這個值。

6.個人感覺所謂的重寫,並不是擦除後重寫,其實就是按照各自的偏移或者入口位址的不同變化,來達到尋找不同成員變數或者函式的目的。可以簡單記為,變數的重寫看引用,函式的重寫看物件。 

Java中覆蓋 重寫 過載詳解

過載 通俗的講就是方法名必須一致,但方法中的引數的狀態不一致!先來看乙個過載的例子 public class overloadtest 方法1 param a param b public static void add int a,int b 方法2 param a param b public ...

Java中的方法過載和重寫(覆蓋)

一.方法過載 overload 方法過載的判定 同一類中,方法名相同,引數列表不同 引數個數不同,引數列表中對應位置引數型別不同 其他方法返回值 和訪問修飾符都隨意。public class overloadtest the first situation the number of param t...

JAVA中的覆蓋問題

1 子類方法的名稱 引數簽名和返回型別必須與父類方法的名稱 引數簽名和返回型別一致,修飾符可以相同也可以不同,但子類的訪問許可權不能低於父類的訪問許可權。2 父類的靜態方法不能被子類覆蓋為非靜態方法。3 子類可以定義與父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法。靜態方法只能隱藏,不...