標籤:空間 技術分享 ext 執行 原則 int class 變數 override
Java的第二大特性-----》繼承
一、什麼是繼承
繼承就是有一個類與另一個類的關係,也可以說一個類擁有另一個類的開放的屬性和方法。舉例說明就是,兒子繼承父親的資產,那麼他便可以享用父親提供給他的便利。繼承中可以體現出來的是代碼的複用,子類可以直接用父類定義的屬性和方法。注意:java中是單繼承 . 使用的方式是extends關鍵字
如下:
public class Dog extends Animal{ }
public class Initial { public static void main(String [] args){ Dog dog=new Dog(); }}
這便是一個繼承,動物類是父類,Dog類是子類,繼承了動物類,並且在Dog類中沒有任何的代碼語句,可以在主類中new 一個Dog對象出來,就是繼承的好處所在了。
那麼,問題來了。。。。
如果子類需要的方法父類提供不了怎麼辦?
那就是方法的重寫
二、繼承之方法的重寫
a. 當子類所需要的父類給予不了,那麼子類必須自力更生,自己實現父類的方法,當然這裡也有就近原則,重寫後的方法會被優先調用。沒有規矩,不成方圓
重寫的規則:重寫的方法傳回值類型、方法名、參數都要相同
b.舉例說明方法的重寫
Object是所有類的父類,想當於鼻祖之類的,如果有類沒有使用extends關鍵字,那麼預設的繼承的Object.
Object中有兩個方法比較有名,toString方法和equals方法
i).Object 中的 toString()方法輸出的是雜湊碼值(對象地址字串),用來唯一區分對象相當於人的社會安全號碼,利用雜湊演算法產生的,前部分是包名,後部分是對象在記憶體的地址,然後我們平時輸出最多的字串就是轉換成字串,那麼我們可以重寫toString
ii).Object 中的equals方法是比較的兩個引用是否指向同一塊記憶體地區,Dog dog =new Dog()中的 dog 其實是一個引用,並不是一個被建立的對象,這裡只是把對象的引用賦給了變數dog,但是我們平時進行的比較都是比較的兩個對象的值是否一樣,不會i去比較是否指向了同一塊地區,所以我們需要重寫equals方法
public class Initial{ public static void main(String [] args){ Dog dog=new Dog(); Dog dog2=new Dog(); if(dog.equals(dog2)){ System.out.println("兩個對象是相同的"); }else{ System.out.println("兩個對象是不相同的"); }
這裡new 了兩次意思就是建立了兩個地址空間,那麼肯定是不同的
這裡重寫了equals方法,進行判斷兩個對象的值是否相同
@Override public boolean equals(Object obj) { if(this==obj) return true; if(obj==null) return false; if(obj.getClass()==obj) return true; Dog other=(Dog)obj; if(other.age!=((Dog) obj).age) return false; return true; }
當然了,方法的重寫是按需要的,所有的重寫的方法都不一定是一樣的。
三、繼承的初始化順序
父類有構造方法、屬性,子類也有構造方法和屬性,那麼到底他們是怎麼樣的初始化順序的呢?
從上面的例子可以看出來,當new 一個Dog的時候,會先執行父類的構造方法,再執行子類的構造方法;而構造方法和屬性的初始化卻是先執行的屬性的初始化,再執行構造方法的初始化(先執行的被覆蓋了,結果中便是後執行的)。所以他們的初始化的順序是:
父類的屬性初始化-----》父類的構造方法初始化--------》子類的屬性初始化---------》子類的構造方法初始化
四、繼承之final關鍵字
final 關鍵字可以修飾類、方法、屬性、變數
a.當final 修飾類時表示這個類不能被繼承
b.當final 修飾方法時表示這個方法不能被重寫(覆蓋)
c.當final 修飾屬性時,在聲明的時候和構造方法中須有一處對其進行初始化,不然的話編譯器會報錯(編譯器會對普通的屬性或者變數進行隱式初始化)。
d.當final 修飾變數時,則為常量,後面不可修改。
final表示的就是最終的,最後的
五、繼承之super關鍵字
super在子類的內部使用,代表的是父類對象,那麼可以使用super 擷取父類的屬性和方法,分別為:super.屬性和super.方法
注意:super 關鍵字與其構造方法有一定的關係
a.如果父類的構造方法是無參的構造方法,子類的構造方法中隱式調用了super(),當然也可以顯示調用,並且在構造方法的第一行
b.如果在父類中的構造方法是自訂的有參的構造方法,那麼在子類中必須顯式的調用有參的構造方法,如
c.如果子類構造方法中既沒有顯式的調用父類的構造方法,父類中也沒有無參的構造方法,那麼編譯器會報錯。
以上便是總結的java的繼承這一大特性。
Java之繼承