簡體   English   中英

通過類而不是對象使用的唯一方法

[英]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中聚合所有靜態部分。

在實例上使用靜態成員可能會產生誤導,因此這是一個不好的做法

http://grepcode.com/file/repo1.maven.org/maven2/org.sonarsource.java/java-checks/3.4/org/sonar/l10n/java/rules/squid/S2209.html

盡管可以從類實例訪問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.

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