JAVA interface & abstract

摘要: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修飾的。
內部類可以繼承或實現一個外部類或者介面。

格式為:
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
    }
}