したがって、静的メソッドを使用して非静的変数にアクセスすることはできないという理解でしたが、次のコードに遭遇しました。
class Laptop {
String memory = "1GB";
}
class Workshop {
public static void main(String args[]) {
Laptop life = new Laptop();
repair(life);
System.out.println(life.memory);
}
public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}
}
エラーなしでコンパイルされます。
そうではありません
public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}
laptopクラスで定義された文字列メモリにアクセスします。これは静的でないインスタンス変数ですか?
コードはエラーなしでコンパイルされるので、ここで何かを理解していないと思います。誰かが私が理解していないことを教えてもらえますか?
静的メソッドは、それが認識しているインスタンスの非静的メソッドおよびフィールドにアクセスできます。ただし、操作するインスタンスがわからない場合、静的でないものにはアクセスできません。
私はあなたがうまくいかないこのような例を間違えていると思います:
class Test {
int x;
public static doSthStatically() {
x = 0; //doesn't work!
}
}
ここで、静的メソッドは、アクセスする必要があるTest
のインスタンスを認識していません。対照的に、それが非静的メソッドである場合、x
はthis.x
(ここではthis
は暗黙的です)を参照することがわかりますが、this
はそうではありません静的コンテキストに存在します。
ただし、インスタンスへのアクセスを提供すると、静的メソッドでさえx
にアクセスできます。
例:
class Test {
int x;
static Test globalInstance = new Test();
public static doSthStatically( Test paramInstance ) {
paramInstance.x = 0; //a specific instance to Test is passed as a parameter
globalInstance.x = 0; //globalInstance is a static reference to a specific instance of Test
Test localInstance = new Test();
localInstance.x = 0; //a specific local instance is used
}
}
object reference
でのみアクセスできます。
クラスレベルで定義されたインスタンス変数は、静的コンテキストで使用している場合はオブジェクト名で修飾する必要があります。 ただし、まったくアクセスできないという意味ではありません。
静的メソッドはその値を変更できません。現在のクラスの参照を使用してそれらにアクセスすることにより、現在の値を取得できます。