Java 重寫和隱藏
1、編譯時型別和執行時型別
Java的引用變數有兩個型別,一個是編譯時型別,一個是執行時型別
編譯時型別:由宣告該變數時使用的型別決定
執行時型別:由該變數指向的物件型別決定
如果編譯時型別和執行時型別不一致,會出現所謂的多型。因為子類其實是一種特殊的父類,因此java允許把一個子類物件直接賦值給一個父類引用變數,無須任何型別轉換,或者被稱為向上轉型,由系統自動完成。
如 Father f = new Son(); Son是Father的子類
引用變數f就會出現編譯時型別和執行時型別不一致的情況 編譯時是Father型別的 執行時是Son型別的
當變數的編譯時型別和執行時型別不一致時,通過變數訪問它所引用的物件的例項時,該例項變數的值由宣告該變數的型別決定。
通過變數訪問它所引用的物件的方法時,該方法的行為由所引用的物件實際型別所決定。
2、隱藏和覆蓋
覆蓋:子類重寫父類的方法,要求方法名和引數型別完全一樣(引數不能是子類),返回值和異常比父類小或者相同(即為父類的子類),訪問修飾符比父類大或者相同。
覆蓋是對於例項方法而言的
方法不能交叉覆蓋:子類例項方法不能覆蓋父類的靜態方法;
子類的靜態方法也不能覆蓋父類的例項方法(編譯時報錯)
隱藏:父類和子類擁有相同名字的屬性或者方法( 方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法)時,父類的同名的屬性或者方法形式上不見了,實際是還是存在的。
隱藏是對於靜態方法和成員變數(靜態變數和例項變數)而言的
(1)當發生隱藏的時候,宣告型別是什麼類,就呼叫對應類的屬性或者方法,而不會發生動態繫結
(2) 屬性只能被隱藏,不能被覆蓋
(3)變數可以交叉隱藏:子類例項變數/靜態變數可以隱藏父類的例項/靜態變數
3、隱藏和覆蓋的區別
(1)被隱藏的屬性,在子類被強制轉換成父類後,訪問的是父類中的屬性
在無強制轉換時子類要訪問父類的屬性使用super關鍵字
(2)被覆蓋的方法,在子類被強制轉換成父類後,呼叫的還是子類自身的方法
子類要是想訪問父類的方法,可以使用super關鍵字
RTTI(run time type identification,執行時型別檢查)
RTTI只針對覆蓋,不針對隱藏
執行時型別為引用變數所指向的物件的型別,編譯時型別是引用變數自身的型別
4、常見的筆試面試題
[java] view plain copy print?- publicclass Test {
- publicstaticvoid main(String[] args) {
- Circle circle = new Circle();//本類引用指向本類物件
- Shape shape = new Circle();//父類引用指向子類物件(會有隱藏和覆蓋)
- System.out.println(circle.name);
- circle.printType();
- circle.printName();
- //以上都是呼叫Circle類的方法和引用
- System.out.println(shape.name);//呼叫父類被隱藏的name屬性
- shape.printType();//呼叫子類printType的方法
- shape.printName();//呼叫父類隱藏的printName方法
- }
- }
- class Shape {
- public String name = "shape";
- public Shape(){
- System.out.println("shape constructor");
- }
- publicvoid printType() {
- System.out.println("this is shape");
- }
- publicstaticvoid printName() {
- System.out.println("shape");
- }
- }
- class Circle extends Shape {
- public String name = "circle"; //父類屬性被隱藏
- public Circle() {
- System.out.println("circle constructor");
- }
- //對父類例項方法的覆蓋
- publicvoid printType() {
- System.out.println("this is circle");
- }
- //對父類靜態方法的隱藏
- publicstaticvoid printName() {
- System.out.println("circle");
- }
- }
public class Test {
public static void main(String[] args) {
Circle circle = new Circle();//本類引用指向本類物件
Shape shape = new Circle();//父類引用指向子類物件(會有隱藏和覆蓋)
System.out.println(circle.name);
circle.printType();
circle.printName();
//以上都是呼叫Circle類的方法和引用
System.out.println(shape.name);//呼叫父類被隱藏的name屬性
shape.printType();//呼叫子類printType的方法
shape.printName();//呼叫父類隱藏的printName方法
}
}
class Shape {
public String name = "shape";
public Shape(){
System.out.println("shape constructor");
}
public void printType() {
System.out.println("this is shape");
}
public static void printName() {
System.out.println("shape");
}
}
class Circle extends Shape {
public String name = "circle"; //父類屬性被隱藏
public Circle() {
System.out.println("circle constructor");
}
//對父類例項方法的覆蓋
public void printType() {
System.out.println("this is circle");
}
//對父類靜態方法的隱藏
public static void printName() {
System.out.println("circle");
}
}
[java]
view plain
copy
print?
- 執行結果:
執行結果:
[java]
view plain
copy
print?
- shape constructor
- circle constructor
shape constructor
circle constructor
[java]
view plain
copy
print?
- circle
- this is circle
- circle
circle
this is circle
circle
[java]
view plain
copy
print?
- shape
- this is circle
- shape
shape
this is circle
shape
相關推薦
Java 重寫和隱藏
1、編譯時型別和執行時型別 Java的引用變數有兩個型別,一個是編譯時型別,一個是執行時型別 編譯時型別:由宣告該變數時使用的型別決定 執行時型別:由該變數指向的物件型別決定 如果編譯時型別和執行時型別不一致,會出現所謂的多型。因為子類其實是一種特殊的父類,因此java允許把一個子類物件直接賦值給一
Java 重載、重寫和隱藏的區別
目標 phi 為什麽不能 int title ide 修改 cati 修飾 Java 重載、重寫和隱藏的區別 一、重載(Overload) 註意:為了正確的區分重載和重寫,請各位務必記清重載(Overload)和重寫(Override)的英文。 (1)重載定義:表示
java中的過載、重寫和隱藏
一、過載(overload) 方法過載就是一個類中定義多個同名的方法,但要求每個方法具有不同的引數型別或者不同的引數個數。過載與返回值的型別和修飾符無關。 class test{ public int fun(int a){} public string fun(strin
java覆蓋和隱藏
子類 xtend 非靜態變量 main 父類引用 subclass override ilo nal 隱藏指的是子類把父類的屬性或者方法隱藏了,即將子類強制轉換成父類後,調用的還是父類的屬性和方法,而覆蓋則指的是父類引用指向了子類對象,調用的時候會調用子類的具體方法。 (
重寫和隱藏的本質,通過demo測試說明
重寫和隱藏的本質區別是:重寫是動態繫結的,根據執行時引用所指向物件的實際型別來決定呼叫相關類的成員。而隱藏是靜態繫結的,根據編譯時引用的靜態型別來決定呼叫的相關成員。換句話說,如果子類重寫了父類的方法,當父類的引用指向子類物件時,通過父類的引用呼叫的是子類方法。如果子類隱藏了父類的方法(成員變數),
Java 重寫和過載的詳解
一,過載 1.概念:對於同一個類,如果這個類裡面有兩個或者多個重名的方法,但是方法的引數個數、型別、順序至少有一個不一樣,這時候局構成方法過載 2.示例: public class Test{ public void a( ){ }; public void
JAVA重寫和過載的區別
問: Java 過載與重寫是什麼?有什麼區別? 答: 過載(Overload)是讓類以統一的方式處理不同型別資料的一種手段,實質表現就是多個具有不同的引數個數或者型別的同名函式(返回值型別可隨意,不能以返回型別作為過載函式的區分標準)同時存
關於Java與c++隱藏、重寫不同實現機制的探討
tail namespace 文獻 ide archive pretty proc font 分開 一、文章來由 本人如今用c++很多其它。可是曾經Java也寫過不少,Java和c++非常像,可是深入挖一些,Java跟c++的差別非常大,就拿剛剛發的另
類與接口(五)java多態、方法重寫、隱藏
增加 object 方法簽名 進行 tcl 覆蓋 get 註意 表現 一、Java多態性 面向對象的三大特性:封裝、繼承、多態。 多態的類型,分為以下兩種: 編譯時多態: 指的是 方法重載。編譯時多態是在編譯時確定調用處選擇那個重載方法,所以也叫 靜態多態,算不上真正的多
C++中重載、重寫(覆蓋)和隱藏的區別
post space csdn depend amp 不同類 sin ase 返回 轉載自:https://blog.csdn.net/zx3517288/article/details/48976097 基本概念: 重載:是指同一可訪問區內被聲明的幾個具有不同參數列(參數
Java中方法重寫和方法重載
自己的 track 增強 父類 () fix content 使用 except 首先方法重寫和方法重載是建立在Java的面向對象的繼承和多態的特性基礎上而出現的。至於面向對象的繼承和多態的特性我就不在這裏多說了。繼承是指在一個父類的基礎再創建
Java重寫hashCode()和equals()方法
哈希 strong tag main 實現 sta 位置 rgs out 1. hashCode 1.1 基本概念 hashCode是JDK根據對象的地址算出來的一個int數字(對象的哈希碼值),代表了該對象再內存中的存儲位置。 hashCode()方法是超級類Ob
Java重寫Override和過載Overload
轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/51457528 本文出自【吳孝城的CSDN部落格】 重寫是子類對父類中允許訪問的的方法的重新編寫 過載是同一類中方法名相同,但返回值型別或引數有所不同的方法的重
java基礎——重寫、隱藏、過載
方法簽名:方法名+引數列表(引數型別、個數、順序) 重寫: 子類重寫父類方法,僅限於例項方法。成員變數和靜態方法不能被重寫,只能被隱藏。 重寫原則: 1.方法名相同,引數型別相同。 2.子類返回型別小於等於父類返回型別。 3.子類異常小於等於父類異常。 4.子類訪問許
面試題16——簡述類成員函式的重寫,過載和隱藏的區別
重寫與過載主要有以下不同: (1)範圍的區別:被重寫的和重寫的函式在兩個類中,而過載和被過載的函式在同一個類中; (2)引數的區別:被重寫函式和重寫函式的引數列表一定相同,而被過載函式和過載函式的引數列表一定不同; (3)virtual的區別:重寫的基類中被重寫的函式必須要有virtual修
java方法重寫和方法過載的區別
方法重寫(override): 子類繼承父類,子類中方法繼承父類的方法。當子類中方法重寫,會覆蓋父類的方法。 eg: class Father{ &
java 重寫(override) 和 過載(overload) 的實現原理
剛開始學習Java的時候,就瞭解了Java這個比較有意思的特性:重寫 和 過載。開始的有時候從名字上還總是容易弄混。我相信熟悉Java這門語言的同學都應該瞭解這兩個特性,可能只是從語言層面上了解這種寫法,但是jvm是如何實現他們的呢,並不是很清楚。 過載官方給出的介
java中方法重寫和過載的那些事兒
1.重寫和過載分別是什麼意思 重寫(Override): 重寫是子類重新定義了父類的同名同參方法,覆蓋了父類的方法,因此,我們也把這種方式叫做“覆寫”。 過載(Overload): 過載是同一個類中,宣告的方法名字相同,但是引數不同的個方法,通過呼叫時傳不同的引數來達到呼叫名
java-方法重寫和方法過載的區別
1、方法過載: - 可以改變返回值型別,只看引數列表。 - 本類中出現的方法名一樣,引數列表不同的方法,與返回值型別無關。 2、方法重寫: - 子類中出現了和父類中方法宣告一模一樣的方法。與返回值型別有關,返回值是一致的,或者是子父類的。 &