Java中的抽象類


抽象類

抽象是一種概念,而不是如何實現,比如你的老板說,大家加油哈,將來發財了人人有份。又如,好好學,將來必成大牛,這些都可以理解成是一種抽象的,你也可以理解成所謂的抽象就是光說不做。

在Java中通過abstract關鍵字定義抽象類,如下

abstract class Base{
    ....
}

被定義為抽象的類,不能使用new關鍵字,首先我們得理解一件事,那就是抽象類,不是給你直接拿來用的,不然就不叫抽象了。

不僅類可以是抽象的,方法也同樣可以是抽象的,比如下面這段代碼

class Base{
    abstract void hello(){
        System.out.println("hello");
    }
}

不過上面這段代碼是錯誤的,我們說抽象是光說不做的,而上面這個hello方法,把具體代碼給實現了,所以是通不過編譯器的,另外一點如果定義了抽象方法,類也必須是抽象的。下面這段代碼才是正確的

abstract class Base{
    abstract void hello();
}

方法可以把大括號去掉,並且后面得加上分號。下面是一個實例

abstract class Base{
    abstract void hello();
}

class A extends Base{
    public void hello(){
        System.out.println("hello A");
    }
}

class B extends Base{
    public void hello(){
        System.out.println("hello B");
    }
}

class app{
    public static void main(String[] args){
        A a = new A();
        B b = new B();

        a.hello();
        b.hello();
    }
}

------Output------
hello A
hello B

因為是抽象類所以我們必須在繼承它的子類中實現具體的方法。那么問題來了,既然都得自己去實現,那和下面這段代碼有什么區別嗎

class Base{
    
}

class A extends Base{
    public void hello(){
        System.out.println("hello A");
    }
}

class B extends Base{
    public void hello(){
        System.out.println("hello B");
    }
}

class app{
    public static void main(String[] args){
        A a = new A();
        B b = new B();

        a.hello();
        b.hello();
    }
}

------Output------
hello A
hello B

這樣肯定是沒有問題的,但是如果說我們想運用多態,就不太行了,我們將上面這段改為多態就會報錯,如下

class Base{
    
}

class A extends Base{
    public void hello(){
        System.out.println("hello A");
    }
}

class B extends Base{
    public void hello(){
        System.out.println("hello B");
    }
}

class app{
    public static void main(String[] args){
        Base a = new A(); // 注意引用類型
        Base b = new B(); // 注意引用類型

        a.hello();
        b.hello();
    }
}

報錯了

我們改成多態以后就報錯了,因為在運用多態時,Base類只認Base中有的方法,除非是子類覆蓋Base中的方法。比如下面這段代碼是可以的

class Base{
    public void hello(){
        System.out.println("hello Base");
    }
}

class A extends Base{
    public void hello(){
        System.out.println("hello A");
    }
}

class B extends Base{
    public void hello(){
        System.out.println("hello B");
    }
}

class app{
    public static void main(String[] args){
        Base a = new A();
        Base b = new B();

        a.hello();
        b.hello();
    }
}

------Output------
hello A
hello B

雖然這樣可以運行,但是你有沒有發現,我們必須實現父類中的hello方法,而如果不實現就不行,像這個情況下,使用抽象類就比較合適了,代碼如下

abstract class Base{
   abstract public void hello();
}

class A extends Base{
    public void hello(){
        System.out.println("hello A");
    }
}

class B extends Base{
    public void hello(){
        System.out.println("hello B");
    }
}

class app{
    public static void main(String[] args){
        Base a = new A();
        Base b = new B();

        a.hello();
        b.hello();
    }
}

------Output------
hello A
hello B

另外使用抽象類還有一個好處,我們一眼看過去就能知道,這是一個抽象類。而如果是下面這段代碼,就沒那么容易分辨了

class Base{
    public void hello(){
        System.out.println("hello Base");
    }
}

class A extends Base{
    public void hello(){
        System.out.println("hello A");
    }
}

class B extends Base{
    public void hello(){
        System.out.println("hello B");
    }
}

class app{
    public static void main(String[] args){
        Base a = new A();
        Base b = new B();

        a.hello();
        b.hello();
    }
}

雖然在代碼少的情況下,也能很好的分辨,但是如果代碼多了,就沒那么容易分辨了。

抽象類在什么情況下比較適用

需要運用多態,並且某些方法在子類中必須重定義時。

參考

JAVA: 為什么要使用"抽象類"? 使用"抽象類"有什么好處?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM