web-dev-qa-db-ja.com

静的メソッドは非静的インスタンス変数にアクセスできますか?

したがって、静的メソッドを使用して非静的変数にアクセスすることはできないという理解でしたが、次のコードに遭遇しました。

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クラスで定義された文字列メモリにアクセスします。これは静的でないインスタンス変数ですか?

コードはエラーなしでコンパイルされるので、ここで何かを理解していないと思います。誰かが私が理解していないことを教えてもらえますか?

9
SERich

静的メソッドは、それが認識しているインスタンスの非静的メソッドおよびフィールドにアクセスできます。ただし、操作するインスタンスがわからない場合、静的でないものにはアクセスできません。

私はあなたがうまくいかないこのような例を間違えていると思います:

class Test {
  int x;

  public static doSthStatically() {
    x = 0; //doesn't work!
  }
}

ここで、静的メソッドは、アクセスする必要があるTestのインスタンスを認識していません。対照的に、それが非静的メソッドである場合、xthis.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
  }
}
24
Thomas

object referenceでのみアクセスできます。

クラスレベルで定義されたインスタンス変数は、静的コンテキストで使用している場合はオブジェクト名で修飾する必要があります。 ただし、まったくアクセスできないという意味ではありません。

0
Bhargav Kumar R

静的メソッドはその値を変更できません。現在のクラスの参照を使用してそれらにアクセスすることにより、現在の値を取得できます。

0
Arun Raaj