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などのインスタンスを必要としない特別な目的のユーティリティ クラスで静的メソッドを宣言します 。後でオーバーライドする必要があるため、オブジェクトの状態を変更します。