Java關鍵字之abstract(抽象類的概念和使用)
1、概述
(1)只給出方法定義而不具體實現的方法被稱為抽象方法,抽象方法是沒有方法體的,在程式碼的表達上就是沒有“{}”。使用 abstract 修飾符來表示抽象方法和抽象類。
(2)abstract修飾符表示所修飾的類沒有完全實現,還不能例項化。如果在類的方法宣告中使用abstract修飾符,表明該方法是一個抽象方法,它需要在子類實現。如果一個類包含抽象方法,則這個類也是抽象類,必須使用abstract修飾符,並且不能例項化。
(3)注意,抽象類除了包含抽象方法外,還可以包含具體的變數和具體的方法。類即使不包含抽象方法,也可以被宣告為抽象類,防止被例項化。
2、抽象類特點
(1)抽象類不能例項化,即不能對其用new運算子;
(2) 類中如果有一個或多個abstract方法,則該類必須宣告為abstract;
(3)抽象類中的方法不一定都是abstract方法,它還可以包含一個或者多個具體的方法;
(4)即使一個類中不含抽象方法,它也可以宣告為抽象類;
(5)抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類物件呼叫。
(6)如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。
3、什麼情況下,使用抽象類
(1)類中包含一個明確宣告的抽象方法;
(2)類的任何一個父類包含一個沒有實現的抽象方法;
(3)類的直接父介面宣告或者繼承了一個抽象方法,並且該類沒有宣告或者實現該抽象方法。
4、程式碼展示
抽象類不能被例項化,抽象方法必須在子類中被實現。請看下面的程式碼:
import static java.lang.System.*;
public final class Demo{
public static void main(String[] args) {
Teacher t = new Teacher();
t.setName("小明");
t.work();
Driver d = new Driver();
d.setName("小陳");
d.work();
}
}
// 定義一個抽象類
abstract class People{
private String name; // 例項變數
// 共有的 setter 和 getter 方法
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
// 抽象方法
public abstract void work();
}
class Teacher extends People{
// 必須實現該方法
public void work(){
out.println("我的名字叫" + this.getName() + ",大家好...");
}
}
class Driver extends People{
// 必須實現該方法
public void work(){
out.println("我的名字叫" + this.getName() + ",大家好...");
}
}
/*
執行結果:
我的名字叫小明,大家好...
我的名字叫小陳,大家好...
*/
5、關於抽象類的幾點說明
(1)抽象類不能直接使用,必須用子類去實現抽象類,然後使用其子類的例項。然而可以建立一個變數,其型別是一個抽象類,並讓它指向具體子類的一個例項,也就是可以使用抽象類來充當形參,實際實現類作為實參,也就是多型的應用。
(2)建構函式和靜態函式以及final修飾的函式不能使用abstract修飾符。
(3)如果試圖建立一個抽象類的例項就會產生編譯錯誤。
(4)如果一個類是非抽象類卻包含一個抽象方法,就會產生編譯錯誤。
(5)抽象類中有建構函式。如果抽象類是父類,需要給子類提供例項的初始化。
6、abstract 關鍵字和哪些關鍵字不能共存?
final:被final修飾的類不能有子類。而被abstract修飾的類一定是一個父類。
private: 抽象類中的私有的抽象方法,不被子類所知,就無法被複寫。而抽象方法出現的就是需要被複寫。
static:如果static可以修飾抽象方法,那麼連物件都省了,直接類名呼叫就可以了。可是抽象方法執行沒意義。
相關文章
- java中的抽象類abstract怎麼使用?Java抽象
- abstract關鍵字 super 關鍵字 類與繼承繼承
- 介面和抽象類 (abstract)抽象
- TypeScript abstract 抽象類TypeScript抽象
- PHP中的 抽象類(abstract class)和 介面(interface)PHP抽象
- PHP 中的抽象類(abstract class)和介面(interface)PHP抽象
- java關鍵字詳解(abstract.double.int.switch) (轉)Java
- java之this關鍵字Java
- Java之繼承和抽象類Java繼承抽象
- c# abstract抽象類及抽象方法_繼承C#抽象繼承
- objective-c 關鍵字和概念Object
- java之抽象類Java抽象
- java抽象類和抽象方法Java抽象
- 關於抽象類和介面一些簡單的概念抽象
- [JAVA] Java物件導向之final、abstract抽象、和變數生命週期Java物件抽象變數
- java之static關鍵字Java
- java之super關鍵字Java
- [java基礎]之JAVA關鍵字Java
- C++中的抽象基類(Abstract Base Class)C++抽象
- Java 關鍵字之 finalJava
- java之final關鍵字Java
- 有關“抽象類”和“介面”的異同之處?抽象
- 在Java中this關鍵字的使用Java
- JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】Java設計模式抽象
- Java抽象(方法,類)和Java的介面Java抽象
- Java™ 教程(使用super關鍵字)Java
- JAVA類的頂層Type抽象和繼承關係Java抽象繼承
- Java學習筆記之介面和抽象類Java筆記抽象
- 介面、抽象類、普通類之間的關係抽象
- c# abstract抽象類_非抽象類_virtual_虛方法_override重寫C#抽象IDE
- Java中的關鍵字和保留字Java
- 你必須知道的.net讀書筆記之第二回深入淺出關鍵字—對抽象程式設計:介面和抽象類筆記抽象程式設計
- 各類關鍵字
- java中抽象類和介面Java抽象
- 關於Java中的物件、類、抽象類、介面、繼承之間的聯絡Java物件抽象繼承
- Java 類與物件(繼承extends super關鍵詞 方法重寫 抽象abstract 訪問修飾符/許可權控制符)Java物件繼承抽象
- abstract類和介面
- 抽象類和匿名方法的使用抽象