package test1;
/*
* 抽象方法:就是加上abstract關鍵字,然后去掉大括號,直接分號結束;
* 抽象類:抽象方法所在的類,必須是抽象類才行,在class之前寫上abstract即可;
*
* 如何使用抽象類和抽象方法:
* 1.不能直接創建new抽象對象
* 2必須用一個子類來繼承抽象父類
*3子類必須要覆蓋抽象類中所有的抽象方法。
* 覆蓋重寫(實現),子類去掉抽象方法的abstract關鍵字,然后補上方法體大括號;
* 4創建子類對象進行使用
* */
public abstract class Student{
//這是一個抽象方法,代表吃東西,但是具體吃什么(大括號的內容)不確定;
public abstract void eat();
// 這是普通的成員方法
public void normalMethod(){
}
}
package test1;
public class test1{
public static void main(String[] args){
Cat c=new Cat();
c.eat();
}
}
class Cat extends Student{
@Override //驗證是否是覆蓋重寫;
public void eat(){
System.out.println("吃菜");
}
}
注意事項:
1抽象類不能創建對象,如果創建,編譯無法通過而報錯,只能創建其非抽象子類的對象;
理解:假設創建了抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義;
2抽象類中,可以有構造方法,是供子類創建對象時,初始化父類成員使用的;
理解:子類的構造方法中,有默認的super(),需要訪問父類構造方法;
package test1;
public abstract class Fu {
public Fu(){
System.out.println("抽象父類構造方法執行!");
}
public abstract void eat();
}
package test1;
public class Zi extends Fu {
public Zi(){
//super();才能調用父類的構造函數,直接new是不允許的
System.out.println("子類構造方法執行");
}
@Override
public void eat() {
System.out.println("吃飯");
}
}
package test1;
import javax.swing.plaf.FontUIResource;
public class test1{
public static void main(String[] args) {
Zi zi=new Zi();
zi.eat();
// Fu fu=new Fu(); 父類是抽象類不能直接new
}
}
3一個抽象類當中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類
這樣沒有抽象方法的抽象類,也不能直接創建對象,在一些特殊場景下有用途。
4抽象類的子類必須重寫抽象類當中的所有抽象方法,否則編譯無法通過而報錯,除非該子類也是抽象類