[英]Unique methods for use through the class rather than an object
因此,我開始學習Java,我認為它是一種很棒的編程語言,但是我遇到了static
關鍵字,據我了解,它可以確保可通過類(例如MyClass.main()
)訪問給定的方法或成員變量MyClass.main()
),而不是僅通過對象( MyObject.main()
)。 我的問題是,是否可以使某些方法只能通過類而不是通過對象進行訪問,這樣MyClass.main()
可以工作,而MyObject.main()
不能工作? 雖然我並不想為此取得任何成就,但我只是出於好奇而知道。
在我的研究中,我找不到在其他任何地方提出的問題,但是如果在其他地方,我希望指出這個問題!
如果很簡單,請原諒我,但是我已經思考了一段時間,卻一無所獲。
謝謝!
任何靜態方法或成員都屬於該類 ,而非靜態成員則屬於object 。
通過執行myObject.method()
調用靜態方法(或使用靜態成員)實際上與MyClass.method()
完全相同,任何適當的IDE都會建議將其更改為第二個,因為實際上無論您使用哪兩個,您在做什么 。
現在回答實際問題:
是否有可能使某些方法只能通過類而不是通過對象訪問
不,據我所知,但就像我說的那樣,任何適當的IDE都會發出警告,因為這沒有什么意義,而且它會立即向其他代碼閱讀者提示您正在處理靜態成員。
在Java中,可以使用這些關鍵字創建對象。(new關鍵字,newInstance()方法,clone()方法,工廠方法和反序列化)創建對象時,它還可以使用類功能,例如靜態方法。
簡短答案:否。
是的,簡短的回答是“否”。
但是您可以將靜態成員放在專用的類中,以便沒有實例共享它們中的任何一個。
MyObject是MyClass的實例,您可以在MyStaticThing中聚合所有靜態部分。
在實例上使用靜態成員可能會產生誤導,因此這是一個不好的做法
盡管可以從類實例訪問
static
成員,但這種形式很差,並且大多數人認為這具有誤導性,因為它向您的代碼讀者暗示每個類實例都有一個成員實例。
另外,不要使用靜態的東西,因為您不能進行抽象和替換實現來擴展代碼。
能夠在實現之間進行切換對於維護和測試很有用。
是否可以使某些方法只能通過類而非對象訪問?
是的。 通過防止類的任何實例被創建,使該類不可實例化來實現此目的:將其構造函數聲明為private
。
public final class NonInstantiable {
private NonInstantiable() {
throw new RuntimeException(
"This class shouldn't be instantiated -- not even through reflection!");
}
/* static methods here... */
}
現在,僅將類的任何方法聲明為static
是有意義的,並且只能通過類名稱來調用它們。 這樣的類通常稱為實用程序類 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.