簡體   English   中英

為什么 Java 類不能既是抽象類又是最終類

[英]Why can't a Java class be both abstract and final

假設我有一個僅包含靜態方法和變量的實用程序類。 例如:

public abstract final class StringUtils
{
    public static final String NEW_LINE = System.getProperty("line.separator");

    public static boolean isNotNullOrSpace(final String string)
    {
        return !(string == null || string.length() < 1 || string.trim().length() < 1);
    }
}

在這種情況下,使類既抽象又最終是有意義的。 抽象是因為創建此類的對象將沒有用,因為所有方法都可以靜態訪問。 Final 因為派生類不能從這個類繼承任何東西,因為它沒有任何非靜態成員。

C# 允許此類類的靜態修飾符。 為什么Java不支持這個?

這是不可能的,因為Java語言規范聲明:

聲明抽象類類型是一個編譯時錯誤,因此無法創建實現其所有抽象方法的子類[1]

除此之外,沒有固有的理由說明抽象的最終類是不合邏輯的 - 抽象這個詞通常與具體形成對比,意味着不存在類型的直接實例。

這與抽象方法無法將訪問修飾符設為私有的原因相同。

無法擴展final類, 需要擴展abstract類才能實例化。 因此, final abstract類將是一個邏輯矛盾。

如果你的類只有static方法,也許你應該hide它的構造函數,將它定義為private .-

private StringUtils() {
}

沒有理由除了主觀性,但你可以通過使你的類抽象並使你的所有方法成為最終來實現相同的目標。 喜歡:

public abstract class MyClass {
    …
    public final static void myMethod1() {
        …
    }

    public final static void myMethod2() {
        …
    }
}

如果您嘗試實例化MyClass的對象,編譯器將檢查此並給出錯誤,並且當任何子類擴展MyClass時也無法覆蓋最終方法

在Java中,無法創建抽象類的實例,我們只能引用抽象類類型。 因此,如果我們將抽象類設為final,那么我們將無法擴展它。 抽象和最終是相互排斥的概念。 這就是為什么當您嘗試在Java中創建抽象類時,Java編譯器會拋出編譯時錯誤的原因

由於某些原因,我們無法最終使用抽象類的final。 如果我們定義抽象最終,那么我們就無法擴展它。 2.如果我們將抽象類定義為final,它將給出編譯時錯誤。

當我們將一個類聲明為抽象類時,它不能被實例化 當我們將一個類聲明為 final 時,它不能被繼承。 要在抽象中實現方法,需要繼承 Class。 但是如果我們將一個類聲明為 final,則該類不能被繼承 因此,我們不能將一個類聲明為抽象類和最終類

永遠不會將方法標記為抽象和最終,或者抽象和私有。 想一想 - 必須實現抽象方法(這實際上意味着被子類覆蓋),而最終和私有方法不能被子類覆蓋。 或者用另一種方式來表達,抽象的指定意味着超類不知道子類在該方法中應該如何表現,而最終的指定意味着超類知道所有子類的所有內容(盡管它們可能在繼承樹的下方) be)應該用那種方法行事。 抽象和最終修飾符實際上是對立的。 因為私有方法甚至不能被子類看到(更不用說繼承了),所以它們也不能被覆蓋,所以它們也不能被標記為抽象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM