1.繼承的概念
把多個類中相同的成員給提取出來定義到一個獨立的類中。然后讓這多個類和該獨立的類產(chǎn)生一個關系,多個類就具備了這些內(nèi)容。這個關系叫繼承蝴乔。
用extends關鍵字表示,格式: class 類名 extends 父類
2.繼承的好處
a: 提高了代碼的復用性;
b:提高了代碼的可維護性驮樊;
c:一個類繼承一個類是多態(tài)的前提薇正;
3.繼承的弊端
a:讓類的耦合性增強。這樣某個類的改變巩剖,就會影響其他和該類相關的類铝穷;
b:打破了分裝性;
4.java中繼承的特點
a:一個類只能繼承一個類佳魔,單繼承曙聂;
b:可以多層繼承,繼承體系鞠鲜;
5.繼承的注意事項
a:子類不能繼承父類的私有成員宁脊;
b:子類不能繼承父類的構造方法,但可以通過super()去調(diào)用贤姆;
c:不要為了部分功能而去繼承榆苞;
6.繼承中的成員關系
a:成員變量:
通過子類的方法訪問成員變量的順序:先找子類方法的局部范圍內(nèi)找,有就使用霞捡;再去子類的成員范圍找坐漏,有就使用;再去父類的成員范圍內(nèi)找碧信,有就使用赊琳;找不到就報錯;
b:構造方法:
子類的構造方法會默認調(diào)用父類的無參構造砰碴,是為了子類訪問父類數(shù)據(jù)的初始化躏筏,如果父類沒有無參構造,在子類構造方法中用super指定調(diào)用父類的帶參數(shù)的構造方法呈枉,或者是之類構造方法通過this調(diào)用自己的構造方法趁尼,這個被調(diào)用的構造方法一定會有一個訪問了父類的帶參構造方法埃碱;
c:成員方法:
通過子類對象訪問成員方法的順序:先在子類中找,有就使用酥泞;再去父類中找砚殿,有就使用;找不到報錯婶博;
7.Override和Overload的區(qū)別
Override方法重寫:在子類中出現(xiàn)了和父類中一模一樣的方法聲明的方法瓮具;
注意事項:
a:子類不能重寫父類的私有方法(因為私有方法不能被繼承)荧飞;
b:子類重寫父類方法時訪問權限不能更低凡人,最好一致;
c:父類靜態(tài)方法叹阔,子類也必須通過靜態(tài)方法進行重寫挠轴,其實這個算不上方法重寫,但是現(xiàn)象確實如此
Overload方法重載:在一個類中出現(xiàn)了方法名稱一樣的方法耳幢;
8.this和super
this:代表當前類的對象引用岸晦;
super:代表父類存儲空間的標識(可以理解為父類的引用,可以訪問父類的)
9.分析執(zhí)行結果
- 1.案例
class Fu {
static {
System.out.println("靜態(tài)代碼塊Fu");
}
{
System.out.println("構造代碼塊Fu");
}
public Fu() {
System.out.println("構造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("靜態(tài)代碼塊Zi");
}
{
System.out.println("構造代碼塊Zi");
}
public Zi() {
System.out.println("構造方法Zi");
}
}
class ExtendsTest2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}
分析:
a: 類加載的時候執(zhí)行靜態(tài)代碼塊睛藻,靜態(tài)代碼塊被優(yōu)先加載启上;
b:初始化子類的時候先初始化父類(分層加載);
c:靜態(tài)代碼塊構造代碼塊構造方法執(zhí)行順序:靜態(tài)代碼塊 > 構造代碼塊 > 構造方法店印;
輸出結果:
靜態(tài)代碼塊Fu
靜態(tài)代碼塊Zi
構造代碼塊Fu
構造方法Fu
構造代碼塊Zi
構造方法Zi
- 2.案例
class F{
A a = new A();
F(){
System.out.println("F1");
}
F(int age){
System.out.println("F2");
}
}
class Z extends F{
A a = new A();
Z(){
//super(1); 這時執(zhí)行的是 F2
System.out.println("Z");
}
}
class A{
A(){
System.out.println("A");
}
}
class ExtendsDemo1{
public static void main(String[] args){
new Z();
}
}
分析:
a:類初始化過程:成員變量初始化-構造方法初始化冈在;
b:子類的初始化:先進行父類初始化,然后進行子類初始化(分層初始化)按摘;
輸出結果:
AF1AZ