14、抽象類

AlexAuthor7發表於2020-11-07

java 第四大特徵 抽象性(abstract 關鍵字的使用)


一、抽象類

概念:有時將父類設計得非常抽象,以至於沒有具體的例項,這樣的類叫做抽象類


二、abstract 關鍵字的使用

abstract 可以用來修飾的結構:方法,類

abstract 修飾類 (抽象類)

  • 此類不能被例項化
  • 抽象類中一定有構造器,便於子類物件例項化時呼叫(涉及子類物件例項化的全過程)
  • 開發中 ,都會提供抽象類的子類 ,讓子類物件例項化 ,完成相關操作

abstract 修飾方法 (抽象方法)

  • 即只有方法的宣告,沒有方法體
  • 包含抽象方法的類一定是抽象類(防止建立方法後,呼叫抽象方法),反之,抽象類中不一定要有抽象方法
  • 若父類是抽象類,且含有抽象物件,則子類中必須重寫這些抽象物件

三、abstract 使用上的注意點:

abstract 不能修飾:屬性、構造器、程式碼塊等結構

abstract 不能修飾私有方法(私有方法不能被重寫)、靜態方法(靜態方法不能被覆蓋) 被final 修飾過的類和方法


四、抽象類的匿名子類

  • 匿名物件
methodA(new OrderA());
  • 非匿名的類 非匿名物件
OrderB o1 = new OrderB();
methodB(o1);
  • 匿名物件 非匿名的類
methodB(new OrderB());
  • 匿名的類 匿名的物件
Order o2 = new Order(){
//建立了一個匿名子類的物件

//注意重寫抽象方法
    @Override
    public void eat() {}
};//注意分號
        methodA(o2);

五、完整示例

1、示例1

public class AbstractTest {
    public static void main(String[] args) {
        //Person p1 = new Person();
        //報錯,Person被abstract修飾,不能被例項化


    }
}
abstract class Person{
    String name;
    int age;

    //構造器
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //抽象方法
    abstract public void eat();
    public void walk(){
        System.out.println("走路");
    }
}

class Student extends Person{
    public Student(String name,int age){
        super();
    }
    public void eat(){//

    }
}

2、示例2

public class ProsenTest {
    public static void main(String[] args) {
        //匿名物件
        methodA(new OrderA());

        //非匿名的類 非匿名物件
        OrderB o1 = new OrderB();
        methodB(o1);

        //匿名物件 非匿名的類
        methodB(new OrderB());

        //匿名的類 匿名的物件
        Order o2 = new Order(){
            //建立了一個匿名子類的物件

            //注意重寫抽象方法
            @Override
            public void eat() {

            }
        };//注意分號
        methodA(o2);

    }
    public static void methodA(Order o){
        o.eat();
    }
    public static void methodB(OrderB o){
        o.eat();
        o.sleep();
    }

}
abstract class Order{
    public Order() {
    }

    public abstract void eat();//注:抽象方法沒有方法體
}
class OrderA extends Order{
    @Override
    public void eat() {

    }
}
class OrderB extends Order{
    @Override
    public void eat() {

    }

    public void sleep(){
        System.out.println("睡覺");
    }

}


相關文章