摘要:JAVA interface & abstract
介面 & 抽象類別
抽象定義:抽象就是從多個事物中將共性的,本質的內容抽取出來。
ex: 狼和狗共性都是犬科,犬科就是抽象出來的概念。鳥跟飛機都會飛,但飛的內容不同
抽象類別:Java中可以定義沒有方法體的方法,該方法的具體實現由子類完成,該方法稱為抽象方法,包含抽象方法的類就是抽象類別。
abstract class Action{
abstract void fly();
}
抽象類別特點:
1. 抽象方法一定在抽象類別中
2. 抽象方法和抽象類別必須被abstract關鍵字修飾
3. 抽象類別不可以用new創建物,因為使用抽象方法沒意義
4. 抽象類別中的方法要被使用,必須由子類覆寫所有抽象方法後,建立子類物件調用。如果子類只覆寫了部分抽象方法,那該子類還是一個抽象類
抽象類別和抽象方法必須用abstract關鍵字來修飾。
抽象方法只有方法聲明,沒有方法體,定義在抽象類別中。格式:修飾符abstract 返回數值型別函數名(參數清單) ;抽象類別不可以被產生實體,也就是不可以用new創建物件。原因如下:抽象類別是具體事物抽取出來的,本身是不具體的,沒有對應的實例。例如:犬科是一個抽象的概念,真正存在的是狼和狗。而且抽象類別即使創建了物件,調用抽象方法也沒有意義。抽象類別通過其子類產生實體,而子類需要覆蓋掉抽象類別中所有的抽象方法後才可以創建物件,否則該子類也是抽象類別。
特殊說明:
抽象類別中也可以不用包含抽象方法,其代表的是該抽象類別只是不想被實例化
介面:
interface {},介面中的成員修飾符是固定的。
成員常量:public static final
成員函數:public abstract
介面的出現將“多繼承”通過另一種形式體現出來,即“多實現”。
介面是對外暴露的規則。
介面是程式的功能擴展。
介面可以用來多實現。
類與介面之間是實現關係,而且類可以繼承一個類且同時實現多個介面。
介面與介面之間可以有繼承關係。
定義:某一類事物的多種存在形態。
interface Person{
public static final int age;
public abstract void say();
}
子類需實作介面所有方法後才可以實例化,否則子類會成為抽象類別
多態:
多態的存在提高了程式的擴展性和後期可維護性
前提:需要存在繼承或者實現關係,即要有覆寫操作
abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
public void eat(){
System.out.println("吃魚");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("吃肉");
}
}
class Hello{
public static void main(String[] args){
show(new Cat());
show(new Dog());
}
public static void show(Animal a){
a.eat();
}
}
Animal a = new Cat(); 向上轉型
a.eat();
若要使用Cat類別獨特的方法時,再使用向下轉型
Cat b = (Cat)a;
向下轉型後就可使用其特有的方法,即Animal類別不具有的方法。而向下轉型必須先要有向上轉型的前提下才可以使用。
instanceof:
instanceof用來判斷是否屬於某一個類別,可以用在向上轉型後,在向下轉型時是否正常
ex:
if(a instance Cat)
多態的引用:
成員方法:是看右邊的類別,前提是子類有覆寫父類方法
成員變數:是看左邊的類別。
在靜態方法中,是看左邊的類別。
ex:
class A{
int num = 1;
void show(){
System.out.print("Function: A");
}
}
class B extends A{
int num = 2;
void show(){
System.out.print("Function: B");
}
}
class Hello{
public static void main(String[] args){
A a = new B();
System.out.println(a.num); //輸出 1
a.show(); //輸出 Function: B
}
}
內部類別:
- 將一個類定義在另一個類的裡面,對裡面那個類就稱為內部類,內部類可以直接訪問外部類中的成員,包括私有成員。
- 而外部類要訪問內部類中的成員必須要建立內部類的物件。
- 內部類定義在成員位置上可以被private static成員修飾符修飾。被static修飾的內部類只能訪問外部類中的靜態成員。
內部類定義在局部位置上也可以直接訪問外部類中的成員。
同時可以訪問所在局部中的區域變數,但必須是被final修飾的。
內部類可以繼承或實現一個外部類或者介面。
同時可以訪問所在局部中的區域變數,但必須是被final修飾的。
內部類可以繼承或實現一個外部類或者介面。
格式為:
new 外部類名或者介面名(){覆蓋類或者介面中的代碼,(也可以自訂內容)}
簡單理解:就是建立一個建立一個帶內容的外部類或者介面的子類匿名物件。
class A{
int num = 1;
class B{
int num = 2;
}
}
class Hello{
public static void main(String[] args){
A.B a = new A().new B();
System.out.println(a.num); //輸出 2
}
}