摘要:所以靜態方法不能被覆蓋。雖然就算你重寫靜態方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態方法,不會阻止你這么做,但你卻得不到預期的結果重寫僅對非靜態方法有用。我們應該直接使用類名來訪問靜態方法,而不要使用對象引用來訪問。
重寫/重載
重寫指的是根據運行時對象的類型來決定調用哪個方法,而不是根據編譯時的類型。所以靜態方法不能被覆蓋。
(如果從重寫方法會有什么特點來看,我們是不能重寫靜態方法的。雖然就算你重寫靜態方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態方法,Java 不會阻止你這么做,但你卻得不到預期的結果(重寫僅對非靜態方法有用)。重寫指的是根據運行時對象的類型來決定調用哪個方法,而不是根據編譯時的類型。讓我們猜一猜為什么靜態方法是比較特殊的?因為它們是類的方法,所以它們在編譯階段就使用編譯出來的類型進行綁定了。使用對象引用來訪問靜態方法只是 Java 設計者給程序員的自由。我們應該直接使用類名來訪問靜態方法,而不要使用對象引用來訪問。)
向上轉型/向下轉型assume 兩個類 Base 類 和 Agg 類,Agg 繼承與 Base .
and 一個原則:父類引用指向子類對象,子類引用不能指向父類對象(不安全)。
javaBase f1 = new Agg (); 父類引用指向子類對象
左邊叫 生成一個父類引用Father f1
右邊叫 生成一個子類對象new Son() f1 引用指向了內存堆中Son對象。
把子類對象直接賦給父類的引用叫向上轉型,向上轉型不用強制轉換。向上轉型就是父類引用指向子類對象,這里誰指向誰記著不方便,一個簡單的記憶方法是 A a = new B(); 可以想象一個箭頭 A a => new B(); namely, A 指向 B.
javaclass Base{ public String getField(){ String name = "Base"; return name; } } class Agg extends Base{ public String getField(){ String name = "Agg"; return name; } }
javapublic class test { public static void main(String[] args) { Base a = new Agg(); System.out.println(""+a.getField()); } }
output: Agg
動態綁定,覆蓋了父類的函數
當我們調用a的方法的時候,我們會首先看看a對應的類有沒有這個方法, 如果有并且被子類覆蓋,這邊就會調用子類的方法。
javaclass Base{} class Agg extends Base{ public String getField(){ String name = "Agg"; return name; } } public class test { public static void main(String[] args) { Base a = new Agg(); System.out.println(""+ ((Agg)a).getField()); } }
output: Agg.
如果沒有,編譯器就認為Base沒有這個函數,直接調用就會報錯 (從這里也能看出向上轉型會丟掉子類的一些信息)。
這時候吧a轉換成Agg類型的對象,編譯器就認為a是一個Agg 類型。可以調用Agg類的函數。
javaclass Base{ public String getField(){ String name = "Base"; return name; } } class Agg extends Base{ public String getField(){ String name = "Agg"; return name; } } public class test { public static void main(String[] args) { Agg b = new Agg(); Base a = (Base)b; 向上轉型的另一個寫法 System.out.println(""+a.getField()); } }
output: Agg
這道題是向上轉型的另一個寫法.
java
class Base{ public static String getField(){ String name = "Base"; return name; } } class Agg extends Base{ public static String getField(){ String name = "Agg"; return name; } } public class test { public static void main(String[] args) { Agg a = new Agg(); Base b = new Agg(); System.out.println(""+a.getField()); System.out.println(""+b.getField()); } }
output : Agg Base
靜態函數不能覆蓋
javaSon s1 = (Son)f1;
把指向子類對象的父類引用,賦給子類引用叫向下轉型,要強制轉換。
javaFather f2 = new Father(); Son s1 = (Son)f2; //編譯出錯,子類引用不能指向父類對象
如
javaclass Base{ public String getField(){ String name = "Base"; return name; } } class Agg extends Base{ public String getField(){ String name = "Agg"; return name; } } public class test { public static void main(String[] args) { Base a = new Base(); Agg b = (Agg)a; 不會編譯通過,這樣向下轉型不可以,不安全。 System.out.println(""+b.getField()); } }
向下轉型:當比較對象的時候,向下轉型是很有用的。
那應該如何安全的向下轉型?
先向上 - 再向下
javaBase b = new Agg(); 先向上 Agg a= (Agg)b; 再向下
再貼一個向下轉型實際應用場景的代碼,比較對象:
javapublic class Person { private String name; private int age; public boolean equals(Object anObject) { if (anObject == null) return false; /* The object being passed in is checked to see it"s class type which is then compared to the class type of the current class. If they are not equal then it returns false */ else if (getClass( ) != anObject.getClass()) return false; else { /* this is a downcast since the Object class is always at the very top of the inheritance tree and all classes derive either directly or indirectly from Object: */ Person aPerson = (Person) anObject; return ( name.equals(aPerson.name) && (age == aPerson.age)); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64269.html
摘要:概念所謂多態,就是指一個引用變量類型在不同的情況下的多種狀態。需進行強制轉換有風險,最好使用進行判斷。繼承在多態中必須存在有繼承關系的子類和父類。在中有兩種形式可以實現多態繼承和接口。 概念 所謂多態,就是指一個引用變量(類型)在不同的情況下的多種狀態。也可以理解為,多態是指通過指向父類的指針,來調用在不同子類中實現的方法。多態性是對象多種表現形式的體現 多態性嚴格來說有兩種描述形式:...
摘要:把這種對某個對象的引用視為對其基類的引用的做法被稱作向上轉型?;蛘呃^承或者重寫了的問題從子類向上轉型到父類,可能會縮小接口。因為向上轉型之后使用引用進行訪問,只能訪問父類定義的接口,而不能訪問自己定義的新接口。 preliminary 最近在讀Thinking in Java這篇是一個基本此書的整理。 什么是向上轉型upcast? 對象既可以作為它本身的類型使用,也可以作為它的基類...
摘要:多態的作用是消除類型之間的耦合關系。編寫構造器準則用盡可能簡單的方法使對象進入正常狀態,如果可以的話,避免調用其他方法。 點擊進入我的博客 在面向對象的程序設計語言中,多態是繼數據抽象(封裝)和繼承之后的第三種基本特征。多態通過分離做什么和怎么做,從另一角度將接口和實現分離開來。多態的作用是消除類型之間的耦合關系。 8.1 再論向上轉型 對象既可以作為它自己的本類使用,也可以作為它的...
閱讀 2139·2021-11-18 10:07
閱讀 3514·2021-09-04 16:48
閱讀 3220·2019-08-30 15:53
閱讀 1242·2019-08-30 12:55
閱讀 2459·2019-08-29 15:08
閱讀 3160·2019-08-29 15:04
閱讀 2884·2019-08-29 14:21
閱讀 2914·2019-08-29 11:21