在這裡我主要是想記錄點繼承的基礎知識,當是一次小小的總結吧,以便自己將來查閱,也便於初學者學習,此文主要是以知識小結為主,不會詳細闡述原理,當然我覺得有必要的還是會講點的,下面從幾個方面來說說哈。
1.子類繼承父類哪些東西呢?
- 子類和父類在同一個包中:子類繼承父類的public,protected,預設存取層級的成員變數和成員方法;
- 子類和父類不再同一包中:子類繼承父類的public,protected存取層級的成員變數和成員方法;
2.什麼叫方法的重載?
如果兩個方法的方法名相同,但參數不一致,那麼就可認為一個是另一個的重載方法。
3.重載方法要滿足哪些條件呢?
- 方法名相同;(必需)
- 方法的傳回型別可以不同;
- 方法的修飾符可以不同;
- 方法參數類型,順序,個數至少有一個不同;(必需)
4.什麼是方法覆蓋?
子類定義一個方法,其名稱,傳回型別及參數簽名正好與父類中某個方法,傳回型別以及參數簽名相匹配,那麼就屬於覆蓋了。
5.方法覆蓋要注意的事項?
- Java編譯器當碰到子類的一個方法名和父類的一方法名相同時,會先判斷它們的參數簽名,如果兩者一致,那麼編譯器就認為子類想覆蓋父類的方法,接下來分析它們的傳回型別,要是該類型也相同,那麼就說明是方法覆蓋了,否則的話就是方法重載啦;
- 子類的方法不能縮小父類方法的存取權限,也就是說要是父類的一方法存取權限為protected,那麼子類要是想覆蓋父類的方法的話,其存取權限至少是protected,當然還可以是public,但是不能是private存取權限;
- 子類方法不能拋出比父類更多的異常,子類方法拋出的異常必須和父類方法拋出的異常相同,或者子類方法拋出異常是父類方法拋出的異常類的子類;
- 方法覆蓋至存在於子類和父類之間,即不存在於同一個類中;
- 父類的靜態方法不能被子類覆蓋為非靜態方法;
- 子類可以定義與父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法;
- 父類的非靜態方法不能被子類覆蓋為靜態方法;
- 父類的私人方法不能被子類覆蓋;
- 父類的抽象方法可以被子類通過兩種方法:一是子類實現父類的抽象方法,而是子類重新聲明父類的抽象方法;
- 父類的非抽象方法可以被覆蓋為抽象方法;
6.子類隱藏父類的靜態方法和子類覆蓋父類的執行個體方法有什麼區別呢?
運行時,Java虛擬機器把靜態方法和所屬的類綁定,而把執行個體方法和所屬的對象綁定。下面舉個例子說明: Java代碼
- public class Base{
- void method(){
- System.out.println("Method of Base");
- }
- public static void staticMethod(){
- System.out.println("Static method of Base");
- }
- }
-
- public class Sub extends Base{
- public void method(){
- System.out.println("Method of Sub");
- }
- public static void staticMethod(){
- System.out.println("Static method of Sub");
- }
- }
-
- public class Test{
- public static void main(String args[]){
- Base sub1=new Sub();
- sub1.method();//列印method of sub
- sub1.staticMethod();//列印Static method of Base;
-
- Sub sub2=new Sub();
- sub2.method();//列印method of sub
- sub2.staticMethod();//列印Static method of Sub;
- }
- }
public class Base{ void method(){ System.out.println("Method of Base"); } public static void staticMethod(){ System.out.println("Static method of Base"); } } public class Sub extends Base{ public void method(){ System.out.println("Method of Sub"); } public static void staticMethod(){ System.out.println("Static method of Sub"); } } public class Test{ public static void main(String args[]){ Base sub1=new Sub(); sub1.method();//列印method of sub sub1.staticMethod();//列印Static method of Base; Sub sub2=new Sub(); sub2.method();//列印method of sub sub2.staticMethod();//列印Static method of Sub; } }
7.只能在構造方法或執行個體方法內使用super關鍵字,而不能在靜態方法和靜態代碼塊中使用super關鍵字。
8.多態中常遇到的問題?
- 對於一個參考型別的變數,Java編譯器按照它聲明的類型來處理(編譯時間),例如:Base s=new Sub();在Base和Sub類中都有var屬性,那麼當我們訪問s.var時它指的是Base類中的var變數值;
- 對於向下轉型必須進行強制類型轉換;例如:Base s=new Sub();(Sub)s;
- 對於一個參考型別的變數,運行時Java虛擬機器按照它實際引用的對象來處理;
- 在運行時環境中,通過參考型別變數來訪問所引用對象的方法和屬性時,java虛擬機器採用以下綁定規則: a.執行個體方法與引用變數實際引用的對象的方法綁定,這種綁定屬於動態綁定,因為是在運行時有java虛擬機器動態決定的;
b.靜態方法與引用變數所聲明的類型的方法綁定,這種綁定屬於靜態繫結,因為實際是在編譯階段已經做了綁定;
c.成員變數(包括靜態變數和執行個體變數)與引用變數所聲明的類型的成員變數綁定,這種綁定屬於靜態繫結,因為實際上是在編譯階段所做的綁定。