Java學(xué)習(xí)之繼承、final/static、多態(tài)、類的加載

繼承

  1. Java所有類都繼承跟類Object

  2. Java只能進(jìn)行單繼承,一個類只能繼承一個類(一個兒子只能有一個父親),一個類可以被多個類繼承(一個父親可以有多個兒子

  3. 變量的繼承

    3.1. 自動繼承父類的public和protect變量,不能繼承private變量,可以通過get方法獲取

    3.2. 如果子類和父類在同一個包下,則可以繼承父類的包成員變量,否則不可以繼承。

    3.3. 如果子類和父類的變量名相同,那么子類將屏蔽父類變量名,子類如果要訪問父類中的變量需要使用super關(guān)鍵字。

  4. 方法的繼承

    4.1. 子類繼承父類的public和protect方法,不能繼承private方法

    4.2. 子類和父類在同一個包下可以繼承包權(quán)限訪問方法,否則不可以

    4.3. 如果子類和父類方法名相同。那么子類將屏蔽父類方法名,子類要訪問父類中的方法需要使用super關(guān)鍵字。

  5. 類的初始化

    當(dāng)A類繼承B類時,A被稱為導(dǎo)出類(derived class),派生類,繼承類,子類。B類稱基類、超類或父類。

    在進(jìn)行繼承操作的時候,導(dǎo)出類(子類)繼承的并不只是基類的方法和變量,而是會在導(dǎo)出類(子類)里面創(chuàng)建一個基類的對象。為了保證基類中一定會有導(dǎo)出類對象,Java會在基類有默認(rèn)構(gòu)造器的時候自動調(diào)用默認(rèn)構(gòu)造器,否組需要使用super關(guān)鍵字顯示的調(diào)用,而且調(diào)用的語句必須是導(dǎo)出類的構(gòu)造器的第一條語句。

final

1.空白final

聲明final但未給定初始值,雖然并未賦值,但是能夠通過編譯器來確??瞻譮inal能夠在使用前被初始化。

final修飾的域定會在定義處或者構(gòu)造器被賦值。

2.final參數(shù)

用于局部內(nèi)部類和匿名內(nèi)部類中。

3.final 方法

當(dāng)final被用來修飾方法的時候,該方法將會被鎖定,其導(dǎo)出類將無法修改或者覆蓋該方法。

4.final類

當(dāng)final被用來修飾類時,這個類無法被繼承,其所有方法均為final的,無法被覆蓋。

5. final和private

類中的private方法都隱式的指定為final。如果一個父類中有一個private的方法,導(dǎo)出類有同名的方法,導(dǎo)出類中的方法并沒有覆蓋父類方法,而是新建了一方法。

6.final和static

static強(qiáng)調(diào)所修飾的域只能有一個。static修飾變量時具有默認(rèn)值,其初始化為編譯期(類加載的時候),初始化之后能夠改變,在初始化之后可以修改,無法修飾局部變量。其無法和super、this等一起使用,如果一個值被修飾為static,那么就可以通過類名直接訪問。

final強(qiáng)調(diào)所修飾的值/方法/類無法修改/覆蓋/繼承。final修飾的變量沒有默認(rèn)值,在初始化之后可以賦值,但是只能賦值一次。

static final表示一個值唯一且無法修改。比如Java里面的PI,可以通過Math.PI直接取值。其源碼定義如下:

The {@code double} value that is closer than any other to pi, the ratio of the circumference of a circle to its diameter. ?
public static final double PI = 3.14159265358979323846;

多態(tài)

Java中多態(tài)的實(shí)現(xiàn)需要三個條件,分別是繼承、重寫和向上轉(zhuǎn)型。如果類的定義如下:

perple是基類,其中有兩個方法,分別是eat()和sleep()
*/
public calss Person(){
 public void eat(){
 System.out.println("people eat");
 }
 public void sleep(){
 System.out.println("people sleep");
 }
}
?
/**
baby 是子類,將會重寫people的兩個方法
*/
public class Baby extends Person{
 //重寫
 public void eat(int a){
 System.out.println("baby eat" + a);
 sleep();
 }
 public void sleep()
 {
 System.out.println("baby sleep");
 }
}
?
/*
測試類
*/
public class Test{
 public static void main(String[] args){
 Person limei = new Baby();
 limei.eat();  //true
 //limei.eat.eat(3)  //false
 }
}

在上面的例子中,baby類繼承了person類,baby重寫了其中的eat類,在test中我們測試的時候可以發(fā)現(xiàn),聲名為父類的時候是無法調(diào)用其子類獨(dú)有重載 )的方法的。這就表示向上轉(zhuǎn)型之后父類對象是無法調(diào)用子類對象的方法的,只能調(diào)用父類自己的方法;但是如果子類中方法和父類方法調(diào)用方式完全一樣( 覆蓋) 的話,那么將會調(diào)用子類方法。

類加載順序

父類靜態(tài)->子類靜態(tài)->父類非靜態(tài)代碼塊->父類構(gòu)造函數(shù)->子類非靜態(tài)代碼塊->子類構(gòu)造函數(shù)

類的隱藏

子類實(shí)例方法無法隱藏父類靜態(tài)方法,子類靜態(tài)方法無法隱藏父類實(shí)列方法。

子類實(shí)例方法可以隱藏父類靜態(tài)方法,子類靜態(tài)方法可以隱藏父類實(shí)例方法。

父類實(shí)例/靜態(tài)公用變量可以被子類同名變量隱藏。

本博文參考https://blog.csdn.net/justloveyou_這個博主,學(xué)習(xí)Java的伙伴們可以看看他的博文,深度推薦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容