什麼是抽象
抽象就是從多個事物中將共性的,本質的內容抽象出來。
什麼是抽象類
Java語言中,用abstract關鍵字修飾的類叫作抽象類。類本身是不存在的,所以抽象類無法建立物件無法例項化。
在物件導向領域,抽象類主要用來進行型別隱藏。
什麼是抽象方法
抽象類中用關鍵字abstract修飾的方法叫做抽象方法(只有宣告,沒有方法體)
例:
public abstract class Car{ //抽象類
public abstract void start(); //抽象方法
}
抽象類的好處
-
可以複用程式碼
-
利用多型隱藏實現類型別,得到更高的靈活性
抽象類的特點
- 抽象類,其修飾符必須為public或者protected,不能是private,因為建立抽象類,就是要被其他類繼承;
- 抽象類不能例項化物件,要透過其普通子類進行例項化;
- 普通類繼承抽象類,則該普通類一定要重寫父類的抽象方法;
- 即使不包括任何abstract方法,亦可將一個類宣告成抽象類;
- 抽象類中可以沒有抽象方法,但是,有抽象方法的類必須是抽象類。
抽象類和具體類的區別
抽象類只有方法的宣告,沒有方法體(具體實現),所以抽象類不能例項化物件;
具體類所有的方法包含方法的宣告和方法體,所以具體類可以例項化物件。
例項
abstract class Door {
public int weight;
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public abstract void open();
public abstract void close();
}
class WoodenDoor extends Door{
public void open(){
System.out.println("Opening wooden door");
}
public void close(){
System.out.println("Closing wooden door");
}
}
class IronDoor extends Door{
public void open(){
System.out.println("Opening iron door");
}
public void close(){
System.out.println("Closing iron door");
}
}
public class Main{
public static void main(String[] args) {
Door door = new WoodenDoor();//向上型別轉換(多型)
door.open();
door.close();
door.setWeight(10);
System.out.println(door.getWeight());
door = new IronDoor();
door.open();
door.close();
}
}
什麼是介面
介面是一套規範或標準。介面只規定必須實現的功能或要求,但是沒有規定如何實現或達到。介面通常用 interface 來宣告。
介面的定義格式
interface 介面名{
介面方法
}
- 介面間多繼承格式
interface 介面名 extends 介面名1,介面名2,...{
...
}
介面的作用
對外提供統一的介面方法,隱藏介面方法的實現細節。
介面的特點
- Java8之前所有介面方法都是抽象方法(只有方法宣告,沒有方法實現),
Java8及以後的版本中,介面可以包含除了抽象方法以外的其他型別的方法,如預設方法、靜態方法。 - 介面不能例項化物件,但類可以使用implements 關鍵字實現介面(一個類可以實現多個介面)
- 類實現介面必須實現所有介面方法(否則這個類必須定義成抽象類)
- 介面中可以定義靜態成員變數(但必須用 final 修飾,即變數值不能更改)
- 介面中的方法是不能在介面中實現的,只能由實現這個介面的類來實現介面中的方法,介面中的方法都是公有的。
- 一個介面不能繼承其他類,但是可以繼承別的介面。
介面的優點
- 介面可以用來對類提供規範或標準(避免類在設計上的不一致性)
- 介面可用於間接實現多重繼承(使用介面為實現類新增額外功能)
- 介面可以使設計與實現相分離(降低程式碼耦合度、保證程式碼安全性)
例項
//TypeC介面
interface TypeC {
final int MAX_VOLTAGE = 5; //常量
void methodA();
void methodB();
}
abstract class Phone {
void charge(){
System.out.println("charge");
}
void play(){
System.out.println("play");
}
}
//小米手機支援TypeC介面
class XiaoMi extends Phone implements TypeC {
@Override
public void methodA() {
System.out.println("methodA");
}
@Override
public void methodB() {
System.out.println("methodB");
}
}
//華為手機支援TypeC介面
class HuaWei extends Phone implements TypeC {
@Override
public void methodA() {
}
@Override
public void methodB() {
}
}
public class Client {
public static void main(String[] args) {
Phone phone = new XiaoMi();
phone.charge();
phone.play();
XiaoMi xiaomi =new XiaoMi();
xiaomi.methodA(); //不靈活
TypeC typeC = new XiaoMi(); //隱藏了具體實現,提高了靈活性
typeC.methodA(); //更加靈活
typeC = new HuaWei();
typeC.methodA();
typeC.methodB();
}
}