1. 程式人生 > >Java 重寫和隱藏

Java 重寫和隱藏

1編譯時型別和執行時型別

Java的引用變數有兩個型別,一個是編譯時型別,一個是執行時型別

編譯時型別由宣告該變數時使用的型別決定

執行時型別由該變數指向的物件型別決定

如果編譯時型別和執行時型別不一致,會出現所謂的多型。因為子類其實是一種特殊的父類,因此java允許把一個子類物件直接賦值給一個父類引用變數,無須任何型別轉換,或者被稱為向上轉型,由系統自動完成。

 Father  f  =  new  Son();  SonFather的子類

引用變數f就會出現編譯時型別和執行時型別不一致的情況 編譯時是Father型別的 執行時是Son型別的

當變數的編譯時型別和執行時型別不一致時,通過變數訪問它所引用的物件的例項時,該例項變數的值由宣告該變數的型別決定。

通過變數訪問它所引用的物件的方法時,該方法的行為由所引用的物件實際型別所決定。

2、隱藏和覆蓋

覆蓋:子類重寫父類的方法,要求方法名和引數型別完全一樣(引數不能是子類),返回值和異常比父類小或者相同(即為父類的子類),訪問修飾符比父類大或者相同。

覆蓋是對於例項方法而言的

方法不能交叉覆蓋:子類例項方法不能覆蓋父類的靜態方法;

                  子類的靜態方法也不能覆蓋父類的例項方法(編譯時報錯)

隱藏:父類和子類擁有相同名字的屬性或者方法( 方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法)時,父類的同名的屬性或者方法形式上不見了,實際是還是存在的。

隱藏是對於靜態方法和成員變數(靜態變數和例項變數)而言的

(1)當發生隱藏的時候,宣告型別是什麼類,就呼叫對應類的屬性或者方法,而不會發生動態繫結

  (2) 屬性只能被隱藏,不能被覆蓋

 (3)變數可以交叉隱藏:子類例項變數/靜態變數可以隱藏父類的例項/靜態變數

3、隱藏和覆蓋的區別

1被隱藏的屬性,在子類被強制轉換成父類後,訪問的是父類中的屬性

  在無強制轉換時子類要訪問父類的屬性使用super關鍵字

(2)被覆蓋的方法,在子類被強制轉換成父類後,呼叫的還是子類自身的方法

     子類要是想訪問父類的方法,可以使用super關鍵字

RTTI(run time type identification,執行時型別檢查)

RTTI只針對覆蓋,不針對隱藏

:因為覆蓋是動態繫結,是受RTTI約束的,隱藏不受RTTI約束

執行時型別為引用變數所指向的物件的型別,編譯時型別是引用變數自身的型別

4、常見的筆試面試題

[java] view plain copy print?
  1. publicclass Test {  
  2.     publicstaticvoid main(String[] args)  {  
  3.         Circle circle = new Circle();//本類引用指向本類物件
  4.         Shape shape = new Circle();//父類引用指向子類物件(會有隱藏和覆蓋)
  5.        System.out.println(circle.name);  
  6.        circle.printType();  
  7.        circle.printName();  
  8.        //以上都是呼叫Circle類的方法和引用
  9.         System.out.println(shape.name);//呼叫父類被隱藏的name屬性
  10.         shape.printType();//呼叫子類printType的方法
  11.         shape.printName();//呼叫父類隱藏的printName方法 
  12.     }  
  13. }  
  14. class Shape {  
  15.     public String name = "shape";  
  16.     public Shape(){  
  17.         System.out.println("shape constructor");  
  18.     }  
  19.     publicvoid printType() {  
  20.         System.out.println("this is shape");  
  21.     }  
  22.     publicstaticvoid printName() {  
  23.         System.out.println("shape");  
  24.     }  
  25. }  
  26. class Circle extends Shape {  
  27.     public String name = "circle"//父類屬性被隱藏
  28.     public Circle() {  
  29.         System.out.println("circle constructor");  
  30.     }  
  31.     //對父類例項方法的覆蓋
  32.     publicvoid printType() {  
  33.         System.out.println("this is circle");  
  34.     }  
  35.    //對父類靜態方法的隱藏  
  36.     publicstaticvoid printName() {  
  37.         System.out.println("circle");  
  38.     }  
  39. }  
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?
  1. 執行結果:  
執行結果:
[java] view plain copy print?
  1. shape constructor  
  2. circle constructor  
shape constructor
circle constructor
[java] view plain copy print?
  1. circle  
  2. this is circle  
  3. circle  
circle
this is circle
circle
[java] view plain copy print?
  1. shape  
  2. this is circle  
  3. 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:方法重寫方法過載的區別

                                          &

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、方法重寫:  -  子類中出現了和父類中方法宣告一模一樣的方法。與返回值型別有關,返回值是一致的,或者是子父類的。 &