java的重載、覆蓋和隱藏的區別

重載:方法名相同,但參數不同的多個同名函數。

發生在子類於父類之間,是指在子類與父類之間或在同一類中定義具有相同的方法名,訪問權限等的方發。

區別在於返回類型或參數列表。


  注意:1.參數不同的意思是參數類型、參數個數、參數順序至少有一個不同

     2.返回值和異常以及訪問修飾符,不能作爲重載的條件(因爲對於匿名調用,會出現歧義,eg:void a ()和int a() ,如果調用a(),出現歧義)

     3.main方法也是可以被重載的


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

   兩同兩小一大

發生在子類與父類的之間,指在在子類中聲明一個和父類具有相同的方法名,參數列表,返回值,訪問權限等的方法,即在子類中重新編寫方法實現的功能。

覆蓋不同於靜態方發的隱藏,父類中被隱藏的方法在子類中完全不可用,而父類中被覆蓋的方法在子類中可以通過其他方式被引用。


    注意:子類實例方法不能覆蓋父類的靜態方法;子類的靜態方法也不能覆蓋父類的實例方法(編譯時報錯),總結爲方法不能交叉覆蓋


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


隱藏現象發生在子類和父類之間,隱藏是針對父類中成員變量和靜態方法而言。

當子類聲明與父類中成員變量具有相同的變量名的變量時,則實現了對父類中成員變量的隱藏;

當子類聲明瞭與父類中的靜態成員方法具有相同的方法名,參數列表和相同的返回值時,則實現了對父類中靜態方法的隱藏。


  注意:當發生隱藏的時候,聲明類型是什麼類,就調用對應類的屬性或者方法,而不會發生動態綁定

      方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法

      屬性只能被隱藏,不能被覆蓋

      子類實例變量/靜態變量可以隱藏父類的實例/靜態變量,總結爲變量可以交叉隱藏

隱藏和覆蓋的區別:

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

  被覆蓋的方法,在子類被強制轉換成父類後,調用的還是子類自身的方法

  因爲覆蓋是動態綁定,是受RTTI(run time type identification,運行時類型檢查)約束的,隱藏不受RTTI約束,總結爲RTTI只針對覆蓋,不針對隱藏


特殊情況:

  1.final修飾的屬性可以被隱藏,但是不能被賦值,即不能用=來賦值,網上說final屬性不能被修改,這個說法不準確,因爲對於引用類型的變量用final修飾後,它只是不能被指向其他對象,但是可以改它自身的值,可以用ArrayList測試,final屬性可以在運行的時候進行初始化,但是不能不出現初始化語句

  2.final修飾的方法不能被覆蓋,可以被重載

  3.final修飾的類不能被繼承

  4.private 方法隱式添加了final

實例:

SuperClass類:

[java] view plain copy
  1. package com.yilong.test.scjp;  
  2.   
  3. public class SuperClass {  
  4.   
  5.     public static int i = 1;  
  6.   
  7.     public int j = 2;  
  8.   
  9.     public final int k = 3;  
  10.   
  11.     public static void method1() {  
  12.   
  13.        System.out.println("SuperClass Method1");  
  14.   
  15.     }  
  16.   
  17.     public void method2() {  
  18.   
  19.        System.out.println("SuperClass Method2");  
  20.   
  21.     }  
  22.   
  23.     public final void method3() {  
  24.   
  25.        System.out.println("SuperClass Method3");  
  26.   
  27.     }  
  28.   
  29. }  

SubClass類:

[java] view plain copy
  1. package com.yilong.test.scjp;  
  2.   
  3. public class SubClass extends SuperClass {  
  4.   
  5.     public static int i = 2;//無論是不是static,都能隱藏父類的變量i  
  6.   
  7.     public static int j = 1;  
  8.   
  9.     public final int k = 4;//無論是不是final,都能隱藏父類的變量k  
  10.   
  11.     public static void method1() {  
  12.   
  13.        System.out.println("SubClass Method1");  
  14.   
  15.     }  
  16.   
  17.     public void method2() {  
  18.   
  19.        System.out.println("SubClass Method2");  
  20.   
  21.     }  
  22.   
  23.     //Cannot override the final method from SuperClass  
  24.   
  25.     /*public final void method3() { 
  26.  
  27.        System.out.println("SubClass Method3"); 
  28.  
  29.     }*/  
  30.   
  31.     public static void main(String[] args) {  
  32.   
  33.        SuperClass sc = new SubClass();  
  34.   
  35.        System.out.println("i = " + sc.i);  
  36.   
  37.        System.out.println("j = " + sc.j);  
  38.   
  39.        System.out.println("k = " + sc.k);  
  40.   
  41.        sc.method1();//靜態方法只能被隱藏  
  42.   
  43.        sc.method2();  
  44.   
  45.         
  46.   
  47.        SubClass subc = new SubClass();  
  48.   
  49.        System.out.println("i = " + subc.i);  
  50.   
  51.        System.out.println("j = " + subc.j);  
  52.   
  53.        System.out.println("k = " + subc.k);  
  54.   
  55.        subc.method1();  
  56.   
  57.        subc.method2();  
  58.   
  59.     }  
  60.   
  61. }  

打印結果:

i = 1
j = 2
k = 3
SuperClass Method1
SubClass Method2
i = 2
j = 1
k = 4
SubClass Method1
SubClass Method2

補充:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章