簡體   English   中英

在Serializable類中使用私有構造函數擴展類

[英]Extending class with private constructor in Serializable class

http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html上詳細介紹了Serializable的文檔

“為了允許序列化不可序列化類的子類型,該子類型可以承擔保存和恢復超類型的公共,受保護和(如果可訪問)包字段狀態的責任。只有當該類可以將其繼承時,該子類型才可以承擔此責任。 extend具有可訪問的no-arg構造函數,用於初始化類的狀態。如果不是這樣,則聲明類Serializable是錯誤的。將在運行時檢測到該錯誤。”

通常,任何帶有私有構造函數的類都不能擴展。 並且此錯誤將在編譯時可見。 但是上述文檔的最后一行說它將在運行時發生。 有什么解釋嗎?

該文件說,不可序列化的超類型需要一個無參數的構造函數。 它並沒有說它應該是私有的。 相反,它表示此構造函數應該可訪問。 文檔對運行時的意義是什么

class A {
    A() {   <-- accessible only in current package
    }
}

public class B extends A implements Serializable {
    public B() {
    }
}

假設A和B都在同一個程序包中。 沒有編譯錯誤。 但是,如果我們嘗試從另一個包中的類C反序列化B的實例,則會得到運行時異常,因為ObjectInputStream會嘗試調用A的no-arg構造函數,但無法從包外部訪問它

您最后的解釋是不正確的。 A的no-arg構造函數是否對C可見並不重要。 它只需要對B可見。

在堅果殼中,只要A具有對B可見的無參數構造函數,就可以將B聲明為可序列化的。

但是原來還是開放的:

當所有驗證信息在編譯期間可用時,為什么在運行時識別此錯誤?

暫無
暫無

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

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