5

私の理解では、静的メンバーはクラスに属しています。では、なぜJavaでオブジェクトを使用してそれらにアクセスできるのでしょうか。

私が何を意味するかを理解するには、次の例を参照してください。

public class Student {
  public static int number = 0;
}

numberこれはクラスに属する静的フィールドですが、以下Studentに示すように引き続きアクセスできます。

Student s = new Student();
int n = s.number;

この決定の背後にある理論的根拠は何ですか?

4

3 に答える 3

7

この背後にある理論的根拠は、オブジェクトはクラスのインスタンスであるため、インスタンスレベルの属性に加えて、クラスに属するすべての属性にアクセスできる必要があるということです。

従来のメールのようなものです。家族全員(静的メンバー)宛てのメールを受信した場合、あなたは家族の一員であるため、それを開くためのライセンスを感じます。一方、メールがあなた(インスタンスメンバー)宛ての場合、あなただけがそれを開く権利があり、あなたの家族の他の誰もそれを開く権利がありません。

これは、C++などの他のオブジェクト指向言語でも同じように機能します。ただし、s.numberコードの読者を誤解させる可能性があるため、静的メンバーにアクセスするために表記を使用することはお勧めしません。これは静的メンバーであるStudent.numberことを明確に示しているため、常に表記を使用する必要があります。numberインスタンス変数を介して静的メンバーにアクセスすると、C#などの最新の言語は警告を発行しますが、それでも言語仕様によれば完全に合法です。

于 2012-06-16T09:57:48.487 に答える
4

どうやら読んだ後、Javaコンパイラは静的変数にアクセスするオブジェクトインスタンスを処理するために必要なフードゥーを実行し、あなたが何を意味するのかを知っています。IDEはそれについて警告を出します。

理由と説明については、次のように読んでください。インスタンスを介して静的メソッドを呼び出さないのはなぜJavaコンパイラのエラーですか。

最終的には言語仕様であり、それに対処する必要があります。それを使用するかどうかはあなたの要求です。私の提案:しないでください

于 2012-06-16T09:54:41.403 に答える
0

この背後にある理論的根拠は... JLS-第8.3.1.1章。静的フィールド

于 2012-06-16T09:54:22.653 に答える