所有的文件和原始碼都開源在GitHub: https://github.com/kun213/DailyCode上了。希望我們可以一起加油,一起學習,一起交流。
day01物件導向【繼承、抽象類】
今日學習內容-2020.9.16
@
類與物件
1、什麼是類
類是現實事物的抽象,將現實事物描述成對應的類,其行為封裝為方法,屬性封裝為成員變數。
2、什麼是物件
物件是從類中得到的具體例項!在定義Person類並沒有一個具體的人出現,而建立物件後,就會出現一個具體的人
繼承
1、說出繼承的概念
當要定義一個類(講師)時,發現已有類(員工)和要定義的類相似,並且要定義的類屬於已有類的一種時,可以將要定義類定義為已有類的子類。同時也可以反過來思考,當多個類(講師,助教,班主任)有共性內容,可以將共性內容向上抽取,抽取到一個新的類(員工)中,那麼多個類和新的類形成的關係叫做繼承。
2、寫出繼承的格式
通過 extends
關鍵字,可以宣告一個子類繼承另外一個父類,定義格式如下:
class 父類 {
...
}
class 子類 extends 父類 {
...
}
3、區分this和super的作用
super和this的含義
-
super :代表父類的儲存空間標識(可以理解為父親的引用)。
-
this :代表當前物件的引用(誰呼叫就代表誰)。
super和this的用法
- 訪問成員
this.成員變數 -- 本類的
super.成員變數 -- 父類的
this.成員方法名() -- 本類的
super.成員方法名() -- 父類的
用法演示,程式碼如下:
class Animal {
public void eat() {
System.out.println("animal : eat");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("cat : eat");
}
public void eatTest() {
this.eat(); // this 呼叫本類的方法
super.eat(); // super 呼叫父類的方法
}
}
public class ExtendsDemo08 {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Cat c = new Cat();
c.eatTest();
}
}
輸出結果為:
animal : eat
cat : eat
animal : eat
- 訪問構造方法
this(...) -- 本類的構造方法
super(...) -- 父類的構造方法
子類的每個構造方法中均有預設的super(),呼叫父類的空參構造。手動呼叫父類構造會覆蓋預設的super()。
super() 和 this() 都必須是在構造方法的第一行,所以不能同時出現。
抽象類
1、寫出抽象方法的格式
抽象方法
使用abstract
關鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個方法名,而沒有方法體。
定義格式:
修飾符 abstract 返回值型別 方法名 (引數列表);
程式碼舉例:
public abstract void run();
2、寫出抽象類的格式
抽象類
如果一個類包含抽象方法,那麼該類必須是抽象類。
定義格式:
public abstract class 類名字 {
}
程式碼舉例:
public abstract class Employee {
public abstract void work();
}
3、注意事項
關於抽象類的使用,以下為語法上要注意的細節,雖然條目較多,但若理解了抽象的本質,無需死記硬背。
-
抽象類不能建立物件,如果建立,編譯無法通過而報錯。只能建立其非抽象子類的物件。
理解:假設建立了抽象類的物件,呼叫抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
-
抽象類中,可以有構造方法,是供子類建立物件時,初始化父類成員使用的。
理解:子類的構造方法中,有預設的super(),需要訪問父類構造方法。
-
抽象類中,可以有成員變數。
理解:子類的共性的成員變數 , 可以定義在抽象父類中。
-
抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
理解:未包含抽象方法的抽象類,目的就是不想讓呼叫者建立該類物件,通常用於某些特殊的類結構設計。
-
抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。
理解:假設不重寫所有抽象方法,則類中可能包含抽象方法。那麼建立物件後,呼叫抽象的方法,沒有意義。
這是我的公眾號,希望大家可以關注,讓我們一起做最好的自我。
我也會把我自學視訊分享在上面,供大家一起學習。