抽象類和介面

抽象類和介面

抽象類abstract

abstract抽象類,抽象類不能實例化,他只是一個約束後面可以理解為會有人幫我們實現具體的功能。抽象類里可以有抽象類也可以有普通方法,但是普通類內不能存在抽象方法。

  1. 不能new這個抽象類,只能靠子類去實現它:約束!
  2. 抽象類中可以寫普通方法
  3. 抽象方法只能在抽象類中

eg:

//父類:
package shiyan;

public abstract class Abstract {
    public Abstract(){
        System.out.println("Abstract的構造器");
    }
    public static void go(){
        System.out.println("Abstract的普通方法");
    }

    public abstract void run();//僅僅約束,證明有這個方法方法沒有實現的方法體

    public static void main(String[] args) {

    }
}



//子類:

package shiyan;

public class  Son extends Abstract {//繼承
    @Override
    public void run() { //實現方法
        System.out.println("子類實現父類的抽象方法");
    }

       public Son()
       {
           System.out.println("StaticStatement的構造器");
       }


    public static void main(String[] args) {
    Son s1=new Son();
        s1.run();//抽象方法,實現體已寫
        s1.go();//繼承自抽象類的普通方法
    }
}

主要還是為了提高效率減少重複的程式碼,對於可以直接使用的用普通方法可以直接繼承使用,對於有變化的可以使用抽象方法每次重新寫出實現。

介面

介面類似於抽象類,不能被實例化,沒有構造方法,只能通過類來實現它。

定義語法:

public interface 介面名 { }

**實現類語法: **

public class 類名 implements 介面名1,介面名2…{

實現介面方法體

}

特點:

  1. 只是一個內部有方法名的抽象個體,沒有方法的實現。

寫一個方法void run(); 其默認屬性為public abstract void run();

  1. 定義的變數默認為常量 如int age=2; 默認為 public static final int age=2;

    public static final自動省略。

  2. 一個類可以實現多個介面,利用 implements關鍵字實現。

  3. 必須重寫介面中的方法。

  4. 在java1.8中介面的靜態方法不能被它的實現類繼承

介面內部允許存在靜態方法,且靜態方法需要寫方法體。在這個介面的實現類中也不強制要求重寫這個靜態方法,也可以選擇重寫。未重寫時:在介面的實現類中可以使用 介面名.方法名 訪問這個方法,但是不能使用該類的實例化對象訪問,重寫後:使用介面名.方法名訪問的是未重寫的方法,使用實現類的對象訪問的是重寫後的方法。

//學生的介面定義
package Interface;

public interface Student {
  int age=20;  //常量定義
  void study();//抽象方法定義,無實現,public abstract自動省去
    public  abstract void run();
    public static void go(){//不被實現類繼承,無法調用
        System.out.println("靜態方法在interface里要有方法體");
    }
}


//老師的介面定義
package Interface;

public interface Teacher {
    int age=44;
    void teach();
}

//實現類
package Interface;

public class BodyIpil implements Student,Teacher{
    @Override
    public void study() {
        System.out.println("學生介面的學習");
    }

    @Override
    public void run() {
        System.out.println("學生介面的跑");
    }

    @Override
    public void teach() {
        System.out.println("老師介面的教學");
    }

    public static void main(String[] args) {
      //  Student.age=2; 常量不能再被修改
        int age= Student.age;
        int age2= Teacher.age;//可以複製給響應的變數
        BodyIpil body01=new BodyIpil();
        body01.run();
        body01.teach();
        body01.study();
       // body01.go();不能繼承go();
    }
}