抽象類和介面
抽象類和介面
抽象類abstract
abstract抽象類,抽象類不能實例化,他只是一個約束後面可以理解為會有人幫我們實現具體的功能。抽象類里可以有抽象類也可以有普通方法,但是普通類內不能存在抽象方法。
- 不能new這個抽象類,只能靠子類去實現它:約束!
- 抽象類中可以寫普通方法
- 抽象方法只能在抽象類中
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…{
實現介面方法體
}
特點:
- 只是一個內部有方法名的抽象個體,沒有方法的實現。
寫一個方法void run(); 其默認屬性為public abstract void run();
-
定義的變數默認為常量 如int age=2; 默認為 public static final int age=2;
public static final自動省略。
-
一個類可以實現多個介面,利用 implements關鍵字實現。
-
必須重寫介面中的方法。
-
在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();
}
}