0

staticメソッドは、同じクラスの静的メソッド/フィールドのみを呼び出すことができます。質問:

  1. メソッドが呼び出されると、JVM がオブジェクトを作成し、JVM が許可する場合はクラスの他の部分にアクセスできるため、static非静的メソッド/フィールドを使用できないのはなぜですか?static

  2. Why does static methods allow objects from non static methods of other classes. Imposing restriction that they can access only static of other classes and letting a static access non static members of same class will cause any difference?

4

5 に答える 5

3

以下は、静的メソッドおよびフィールドの Java 言語仕様です。それがあなたを助けることを願っています

8.3.1.1. 静的フィールド

フィールドが静的であると宣言されている場合、クラスのインスタンスが最終的にいくつ (場合によってはゼロ) 作成されても、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある静的フィールドは、クラスが初期化されるときに具体化されます (§12.4)。

静的と宣言されていないフィールド (非静的フィールドと呼ばれることもあります) は、インスタンス変数と呼ばれます。クラスの新しいインスタンスが作成されるたびに (§12.5)、そのインスタンスに関連付けられた新しい変数が、そのクラスまたはそのスーパークラスで宣言されたすべてのインスタンス変数に対して作成されます。

8.4.3.2. 静的メソッド

static として宣言されたメソッドは、クラス メソッドと呼ばれます。

クラスメソッドのヘッダーまたは本体で、周囲の宣言の型パラメーターの名前を使用すると、コンパイル時エラーになります。

クラス メソッドは、特定のオブジェクトを参照せずに常に呼び出されます。キーワード this (§15.8.3) またはキーワード super (§15.11.2) を使用して現在のオブジェクトを参照しようとすると、コンパイル時エラーになります。

静的と宣言されていないメソッドはインスタンス メソッドと呼ばれ、非静的メソッドと呼ばれることもあります。

インスタンス メソッドは、メソッド本体の実行中にキーワード this および super が参照する現在のオブジェクトになるオブジェクトに関して常に呼び出されます。

于 2013-10-08T06:43:41.337 に答える
3

非静的メソッドには、this他の非静的メソッドで呼び出すことができる暗黙的なオブジェクトがあります

静的メソッドは、暗黙的に使用するオブジェクトを持たないため、非静的メソッドを暗黙的に呼び出すことはできません。オブジェクトを明示的に使用してメソッドを呼び出すことを止めるものは何もありません。

例えば

class Main {
    public static void main(String... ignored) {
        new Main().nonstatic(); // calls non-static method
    }

    public void nonstatic() {
        nonstatic2(); // calls non-static object with implicit reference to "this"
    }

    public void nonstatic2() {
        staticMethod(this);
    }

    public static void staticMethod(Main main) {
        main.nonstatic3(); // static calls non-static with explicit object.
    }

    public void nonstatic3() {
    }

静的メソッドは、同じクラスの静的メソッド/フィールドのみを呼び出すことができます。

例が示すように、これは当てはまりません。

静的メソッドが呼び出されると、JVM がそのオブジェクトを作成したため、非静的メソッド/フィールドを静的に使用できないのはなぜですか。

JVM は自動的にオブジェクトを作成できますが、特にオブジェクトにデフォルトのコンストラクターがない場合は、これが役立つ可能性は低いです。

JVMが許可する場合、クラスの他の部分にアクセスできるのはどれですか?

許可することはできますが、これは有用というよりも混乱を招くため、私見ではすべきではありません。

静的メソッドが他のクラスの非静的メソッドからのオブジェクトを許可するのはなぜですか。

静的メソッドは、他のクラスだけでなく、すべてのクラスのオブジェクトを許可します。

他のクラスの static のみにアクセスできるという制限を課し、 static に同じクラスの非 static メンバーへのアクセスを許可すると、違いが生じますか?

違いは、クラスの暗黙的なインスタンスがないことです。これが静的メソッドの要点です。

暗黙的なインスタンスが必要な場合は、非静的メソッドを使用します。

于 2013-10-08T06:54:09.150 に答える
2

静的メソッドが呼び出されると、JVM はそのオブジェクトを作成します

本当じゃない。静的メソッドは、静的メソッドを定義するそのクラスのオブジェクトを作成せずに呼び出すことができます ( rememberpublic static void main() )。

Static Methods() が他のクラスの非静的メソッドからのオブジェクトを許可するのはなぜですか。

これは、other classe静的メソッドを定義するクラスのオブジェクト ( にアクセスする) が存在するかどうかに関係なく、インスタンスが存在できるためother classです。

詳細については、このリンクをご覧ください。

于 2013-10-08T06:40:22.443 に答える
2

staticメソッドがメソッドを呼び出しnon static たり変数にアクセスしたりできない理由を理解するには、クラスオブジェクトnon staticの違いを理解する必要があります。

Java はオブジェクト指向言語です。まず、状態を保持するクラス(インスタンス変数) と状態を変更するメソッド (インスタンス変数) を定義します。しかし、クラスはオブジェクトではありません。これは、キーワードを使用してオブジェクトを作成するための単なるテンプレートです (クラスのインスタンスを作成します)。newオブジェクトを作成すると、その変数は初期状態になり、オブジェクトの状態を読み取ったり変更したりするメソッドを呼び出します。このような変数とメソッドはnon static、クラスのオブジェクト インスタンスを必要とするという意味です。

ただし、クラスでは、状態を読み取ったり変更したりしないメソッドを定義できます。メソッドの動作は、インスタンス変数にまったく依存しません。このようなメソッドは static と宣言できます。つまり、メソッドを実行するためにクラスのインスタンスは必要ありません。

クラスで静的メソッドを直接呼び出します (オブジェクトへの参照なし)。

MyClass.staticMethod();//will not read or change any state, because there is no object here

オブジェクトで静的メソッドを呼び出すこともできますが、オブジェクトの状態にアクセスすることはできません。これは、その動作がオブジェクトの状態に依存したり変更したりしないためです。への呼び出しobj.staticMethod();は次と同じMyClass.staticMethod();です:

//Create an instance of a MyClass
MyClass obj = new MyClass();

//will not read or change any state of obj. 
obj.staticMethod();

ただし、静的メソッドは完全にステートレスではなく、静的変数の状態を読み取ったり変更したりできることに注意してください。

また、Java では静的メソッドをオーバーライドできないことにも注意してください (Delphi とは異なります)。サブクラスでメソッドをオーバーライドする必要があると思われる場合は、メソッドを静的として宣言しないでください。したがって、経験則として、 java.lang.Mathなどのインスタンスを必要としない特別な目的のユーティリティ クラスで静的メソッドを宣言します 。後でオーバーライドする必要があるため、オブジェクトの状態を変更します。

于 2013-10-08T11:35:42.090 に答える