繼承
Java所有類都繼承跟類Object
Java只能進(jìn)行單繼承,一個類只能繼承一個類(一個兒子只能有一個父親),一個類可以被多個類繼承(一個父親可以有多個兒子
-
變量的繼承
3.1. 自動繼承父類的public和protect變量,不能繼承private變量,可以通過get方法獲取
3.2. 如果子類和父類在同一個包下,則可以繼承父類的包成員變量,否則不可以繼承。
3.3. 如果子類和父類的變量名相同,那么子類將屏蔽父類變量名,子類如果要訪問父類中的變量需要使用super關(guān)鍵字。
-
方法的繼承
4.1. 子類繼承父類的public和protect方法,不能繼承private方法
4.2. 子類和父類在同一個包下可以繼承包權(quán)限訪問方法,否則不可以
4.3. 如果子類和父類方法名相同。那么子類將屏蔽父類方法名,子類要訪問父類中的方法需要使用super關(guān)鍵字。
-
類的初始化
當(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的伙伴們可以看看他的博文,深度推薦。