ホーム>source

非静的クラスが静的メソッドと変数を持つことができるのに、静的クラスが非静的メソッドと変数を持つことができないのはなぜですか?

非静的クラスに静的メソッドと変数があることの利点は何ですか?非静的クラスに静的コンストラクタがあることは理解できますが。

あなたの答え
  • 解決した方法 # 1

    静的クラスはそもそもインスタンス化できないため、静的でない(インスタンス)メンバーを宣言できたとしても、それらにアクセスすることはできません。その理由でそれを許可する意味は本当にないので、言語は単にそれを禁止します。

    静的クラスはクラスだけ、非静的クラスに直接関連するものは2つあります。クラス 自分自身、そしてインスタンス/オブジェクト クラスの。

    非静的クラスは静的メンバーと非静的メンバーの両方を持つことができるため、静的メンバーはクラスに適用され、非静的メンバーはそのクラスのインスタンスに適用されます。

  • 解決した方法 # 2

    静的クラスには非静的メンバーを含めることはできません。これは、定義によりインスタンス化できないため、これらのメンバーを使用する可能性がないためです。

    ただし、非静的クラスの静的メンバーは、クラスインスタンスがなくても使用できます。これは、ユーティリティメソッドやファクトリメソッドなど、少し異なるシナリオです。

  • 解決した方法 # 3

    フィールド名を持つクラスPersonがあるとします。そして、議論のために、Javaが静的メソッドが非静的メンバー変数に直接アクセスすることを許可したと仮定しましょう。次に、PersonにgetName静的メソッドを次のように指定します。

    <前>ウィズウィズ

    次に、このクラスを例で使用してみましょう。

    <前>ウィズウィズ

    だから私に言って、この例ではPerson.getName()がいったい何を印刷することを期待するでしょうか?アリス?ボブ?ヌル?

    正解はありません。名前はクラス全体ではなく、個人(インスタンス)に属するものであるため、意味がありません。したがって、アクセスする必要のある非静的メンバーを知る方法がないため、静的メソッドが非静的メンバーにアクセスすることはできません。

    class Person { private final String name; public Person(String name) { this.name = name; } public static String getName() { return name; } }

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Kubernetesボリュームバインディングの結果が古いデータ