1. 程式人生 > >java基礎知識--第六篇

java基礎知識--第六篇

一:繼承(extends)
1.如何表達這個關係呢?
通過extends關鍵字可以實現類與類的繼承
格式:
class 子類名 extends 父類名 {} 
父類:基類,超類
子類:派生類


       例: 學生類:
成員變數:name,age
構造方法:無參,帶參
成員方法:getXxx()/setXxx(),eat(),sleep()


         老師類:
成員變數:name,age
構造方法:無參,帶參

成員方法:getXxx()/setXxx(),eat(),sleep()

       2.用繼承的思想來做

首先定義個 -------人類:
成員變數:name,age
構造方法:無參,帶參
成員方法:getXxx()/setXxx(),eat(),sleep()

學生類:老師類,都繼承人類
       優點: A:提高了程式碼的複用性
   多個類相同的成員可以放到同一個類中
        B:提高了程式碼的維護性
   如果功能的程式碼需要修改,修改一處即可

        C:讓類與類之間產生了關係,是多型的前提


方法重寫(子類的方法名,引數和父類完全一樣,將父類方法覆蓋):
1.必須存在繼承關係
2.父類的方法滿足不了你的需求,此時你就需要重寫父類的方法,實現自己想要實現的功能

繼承的特點:
A:Java只支援單繼承,不支援多繼承。一次只能繼承一個父類
B:Java支援多層(重)繼承(繼承體系)。(父類還可以繼承)

繼承中類之間體現的是:”is a”的關係

3.類的組成:成員變數 構造方法 成員方法
繼承間的成員變數關係:
A:名字不同,非常簡單。
B:名字相同
首先在子類區域性範圍找
然後在子類成員範圍找
最後在父類成員範圍找(肯定不能訪問到父類區域性範圍)
如果還是沒有就報錯。(不考慮父親的父親…)
就近原則。


需求:
請在show方法中輸出4,3,2,1
class Fu {
public int num = 1;
}


class Zi extends Fu {
public int num2 = 2;
public int num = 3;


public void show() {
int num = 4;
int a=this.num;
int b = super.num;
       System.out.print(num);
       System.out.print(a);
       System.out.print(num2);
       System.out.print(b);

}
}

class ExtendsTest {
public static void main(String[] args) {
Zi z  = new Zi();
z.show();
}
}


怎麼去訪問父親的成員呢?
java就提供了一個關鍵字:super
super:
super代表父類儲存空間的標識(可以理解為父類物件)

this和super的使用區別?
A:成員變數
this.成員變數 本類的成員變數
super.成員變數 父類的成員變數
B:成員方法
this.成員方法() 本類的成員方法
super.成員方法()父類的成員方法


4.繼承間的成員方法關係:
A:方法名不同,非常簡單
B:方法名相同
首先在子類中找
然後在父類中找
如果還是沒有就報錯。(不考慮父類的父類…)

1.7
繼承間構造方法的關係:
子類中所有的構造方法預設都會訪問父類中空引數的構造方法

因為子類會繼承父類中的資料,可能還會使用父類的資料。
所以,子類初始化之前,一定要先完成父類資料的初始化。
每個子類的構造方法的第一行,有一條預設的語句:
super();


注意:僅僅是完成資料的初始化,建立物件目前必須用new申請空間。

假如父類沒有無參構造方法,該怎麼辦呢?
A:呼叫父類的其他構造方法。帶參構造。
怎麼訪問呢?
super(...)


注意:
super(…)或者this(….)必須出現在第一條語句上。
因為如果可以放後面的話,就會對父類的資料程序多次初始化。所以,只能放在第一條語句上。
    無參構造最好自己給出。

二:final關鍵字
在實際開發的時候,有些方法的內容一旦寫定後,就不允許被改動。
即時是子類,也不允許。那麼該怎麼解決這個問題呢?
java為了解決這樣的問題就提供了一個關鍵字:final


final:
最終的意思。它可以修飾類,方法,變數。


特點:
修飾方法,方法不能被重寫。
【重點】修飾類,類不能被繼承。
修飾變數,變數的值不能再改動。其實這個時候變數已經變成了常量。


常量:
A:字面值常量
'a',12,"hello"
B:自定義常量
就是把變數用final修飾。


定義一個常量。


final 資料型別 變數名;
final int MAX_AGE = 20;
三:多型
多型:同一個物件,在不同時刻表現出來的不同狀態。
多型的前提:
A:有繼承關係
B:有方法重寫(不是必要條件,但是隻有有了方法重寫多型才有意義)
C:有父類引用指向子類物件
Fu f = new Fu();
左邊:Fu型別的引用
右邊:Fu型別的物件

Zi z = new Zi();
Fu f = new Zi();父類引用指向子類物件

成員訪問特點
A:成員變數
編譯看左邊,執行看左邊
B:構造方法
子類構造預設訪問父類的無參構造
C:成員方法(重點理解)
編譯看左邊,執行看右邊

為什麼變數和方法不一樣呢?
方法重寫。
D:靜態成員方法
編譯看左邊,執行看左邊
因為靜態的內容是和類相關的,與物件無關。(靜態-隨著類的載入而載入,與創不建立無關)
練習:
看程式寫結果(先判斷有沒有問題,如果沒有,寫出結果)
class Fu {
public void show() {
System.out.println("fu show");
}
}


class Zi extends Fu {
public void show() {
System.out.println("zi show");
}


public void method() {
System.out.println("zi method");
}
}


class DuoTaiTest {
public static void main(String[] args) {
Fu f = new Zi();
f.method();   //false
f.show();      //zi show
}
}

練習:(貓狗案例演示)
如何使用子類特有功能
A:建立子類物件
B:把父類引用轉為子類物件


向上轉型
從子到父
父類引用指向子類物件


向下轉型
從父到子
父類引用轉為子類物件


四:抽象類
4.1
抽象類特點:
A:抽象類和抽象方法必須用abstract關鍵字修飾
B:抽象類不一定有抽象方法,有抽象方法的類一定是抽象類
C:抽象類不能例項化
那麼,如果例項化並使用呢?
按照多型的方式,由具體的子類例項化。其實這也是多型的一種,抽象類多型。
D:抽象類的子類
要麼是抽象類
要麼重寫抽象類中的所有抽象方法


抽象類的作用:
強制要求子類必須要重寫某些方法。


4.2
抽象類 -- 特點 -- 成員特點 -- 案例

類的組成:
成員變數:
構造方法:
成員方法:


抽象類的成員:
成員變數:可以是變數,也可以是常量。
構造方法:有構造方法
不能例項化,構造方法有什麼用呢?
用於子類訪問父類資料的初始化。
成員方法:既可以是抽象的,也可以是非抽象的。


五、多型:
具體類多型
class Fu {}
class Zi extends Fu {}
抽象類多型
abstract class Fu {}
class Zi extends Fu {}
介面多型


多型的前提:
繼承
方法重寫
因為抽象類中的方法是抽象方法。
父類引用指向子類物件

五:介面
認識介面:不是我們現實生活中的usb介面等等實物的介面,類實現介面代表著這個類自身功能的一種擴充套件,所以介面代表著一種擴充套件的能力

介面的特點:
A:定義介面要用關鍵字interface表示
格式:interface 介面名 {}
B:類實現介面用implements表示
格式:class 類名 implements 介面名 {}
C:介面不能例項化
那麼,介面如何例項化呢?
按照多型的方式,由具體的子類例項化。其實這也是多型的一種,介面多型。
D:介面的實現類
要麼是抽象類
要麼重寫介面中的所有抽象方法


多型的前提:
A:有繼承或者實現關係
B:有方法重寫
C:有父類引用或者父介面引用指向子類或者實現類物件


多型分類:
A:具體類多型
B:抽象類多型
C:介面多型


介面的成員特點:
A:成員變數
只能是常量。
預設修飾符:public static final
B:構造方法
沒有構造方法
C:成員方法
只能是抽象方法。
預設修飾符:public abstract

類與類:
繼承關係。只能單繼承,可以多層(重)繼承。

類與介面:
實現關係。可以單實現,也可以多實現。
還可以在繼承一個類的同時實現多個介面。


介面與介面:
繼承關係。可以單繼承,也可以多繼承。
介面和抽象類的關係最後分析:
抽象類和介面的區別
A:成員區別
抽象類:
成員變數:可以是變數,也可以是常量
構造方法:有構造方法
成員方法:可以是抽象方法,也可以是非抽象方法
介面:
成員變數:只能是常量。預設修飾符 public static final
成員方法:只能是抽象方法。預設修飾符 public abstract
B:關係區別
類與類:
繼承關係。只能單繼承,可以多層(重)繼承。

類與介面:
實現關係。可以單實現,也可以多實現。
還可以在繼承一個類的同時實現多個介面。


介面與介面:
繼承關係。可以單繼承,也可以多繼承。
C:設計理念區別
抽象類被繼承體現的是:"is a"的關係。抽象類定義的是共性功能。
介面被實現體現的是:"like a"的關係。介面定義的是擴充套件功能。