2016-07-08 6 views
3

静的メソッドを使用して非静的変数にアクセスすることはできませんが、私は次のコードに遭遇しました。静的メソッドは非静的インスタンス変数にアクセスできますか?

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"; 
} 

ではないでしょうか?

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

+0

あなたがワークショップで非静的フィールドを持っていた場合、あなたは静的文脈からそれにアクセスすることができませんでした。しかし、あなたが作成した静的でないオブジェクトの静的でないフィールドに**静的なコンテキストの中で**アクセスすることは、まったく問題ありません。 – Fildor

答えて

11

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

私はあなたが動作しません。このような例で間違えていると思う:

ここ
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 
    } 
} 
0

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

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

関連する問題