web-dev-qa-db-ja.com

非静的メソッドは静的変数を変更できますか

非静的メソッドが静的変数をどのように変更できるか疑問に思っています。静的メソッドは、他の静的メソッドと静的変数にしかアクセスできないことを知っています。しかし、反対側は本当ですか?非静的メソッドは非静的変数のみにアクセスできますか?例えば:

public class SampleClass {
  private static int currentCount = 0;

  public SampleClass() {
    currentCount++;
  }

  public void increaseCount() {
    currentCount++;
  }
}

このコードはコンパイルされますが、静的アクセス権限の観点から私はその理由を知りたいです。

24
Brian Vanover

私はこれを The Java Tutorials

  • インスタンスメソッドは、インスタンス変数とインスタンスメソッドに直接アクセスできます。
  • インスタンスメソッドは、クラス変数とクラスメソッドに直接アクセスできます。
  • クラスメソッドは、クラス変数とクラスメソッドに直接アクセスできます。
  • クラスメソッドは、インスタンス変数またはインスタンスメソッドに直接アクセスできません。オブジェクトメソッドを使用する必要があります。また、これを参照するインスタンスがないため、クラスメソッドはthisキーワードを使用できません。

答えはイエスです、非静的メソッドは静的変数を変更できます

37
Brian Vanover

いいえ、非静的メソッドは静的メンバーにアクセスできます。これがfalseになる唯一の方法は、非静的コンテキストが静的メンバーにアクセスできなかった場合です(たとえば、静的メンバーはクラスに対してプライベートであり、非静的コードはそのクラスにありません)。インスタンス無料の変数/メソッドを提供する静的変数が存在するため、たとえば、Gameクラスとhighscore変数がある場合、highscoreは静的(インスタンスなしでアクセス可能)で、すべてのゲーム(Gameクラスのインスタンス)の後スコアがハイスコアより大きい場合、非静的コンテキストからハイスコアを変更できます。

17
Robert Mitchell

非静的メソッドは静的変数にアクセスできます。静的メソッドは、object.ex:public static void main(String arg [])を作成せずに、静的変数またはメソッドのみに直接アクセスできます。

6
vaishnavi

静的メンバーはインスタンスメンバーではなく、クラスによって共有されるため、基本的にすべてのインスタンスメソッドがこれらの静的メンバーにアクセスできます。

0
hellrocker

はい、静的メソッドは非静的変数にアクセスできます。これは、クラスへのオブジェクトを作成し、オブジェクトを介して変数にアクセスすることにより行われます。以下の例では、mainは、静的でない変数である変数aにアクセスする静的メソッドです。

デモコード:

public class Sample {

   private int a;

   void method()
   {
       System.out.println("i am a private method");
   }

   public static void main(String[] args)
   { 
       Sample sample=new Sample();
       sample.a=10;
       System.out.println(sample.a);
   }
}   
0

非静的メソッドは、クラスのメンバーとして静的変数と静的メソッドの両方にアクセスできます

デモコード

public class Static_Class {
    protected static String str;
    private static int runningLoop;

    static{
        str = "Static Block";
    }

    /**
     * Non-Static Method Accessing Static Member  
     */
    public void modifyStaticMember(){
        str = "Non-Static Method";      
    }

    /**
     * Non-Static Method invoking Static Method
     */
    public void invokeStaticMethod(){
        String[] args = {};
        if(runningLoop == 0){
            runningLoop++;
            main(args); 
        }
        //Exiting as it will lead to Java.lang.StackOverflowError
        System.exit(0);
    }

    public static void main(String[] args) {
        Static_Class instance = new Static_Class();
        System.out.println(str);
        instance.modifyStaticMember();

        // Changed Value persists 
        System.out.println(str);

        //Invoking Static Method
        instance.invokeStaticMethod();

    }
}
0
Abhijeet

このように見てください。静的変数には多くの方法でアクセスできます。静的変数はクラスごとであるため、最も一般的な方法の1つは、変数名の前にクラス名を付けることです。同じクラス内でこの変数を参照するため、having toの前にクラス名を付ける必要はありません。静的変数をどこで呼び出すかは問題ではありません。また、これは他のクラスからはアクセスできないプライベートな静的変数です。

0
happybuddha

静的変数は、インスタンスまたはローカル変数ではなくクラス変数です。そのため、非静的メソッドでも静的変数を使用できます。および静的変数はオブジェクトごとではありません。静的変数には、プログラム全体で使用されるコピーが1つあります。

0
Abhishek

静的メソッドは非静的フィールドを変更できません。-非静的フィールド(クラス外)を使用する場合は、クラスオブジェクトをインスタンス化する必要がありますが、静的メソッドを使用する場合は、オブジェクトをインスタンス化する必要はありません。非静的メソッド(オブジェクトのインスタンス化を必要としない)がインスタンス化されるべきフィールドを変更することは合理的ではない理由です。

このために、静的メソッドは静的フィールドのみに触れることができます(または他の静的メソッドを呼び出します)。

ただし、別の方法で説明したように、非静的メソッドはクラスのすべてのオブジェクトに対して静的な静的フィールドを変更できます。

0
Mercury