27

我想知道非静态方法如何修改静态变量。我知道静态方法只能访问其他静态方法和静态变量。然而,另一面是真的吗?非静态方法可以只访问非静态变量吗?例如:

public class SampleClass {
  private static int currentCount = 0;

  public SampleClass() {
    currentCount++;
  }

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

这段代码可以编译,我想知道为什么在静态访问权限方面。

4

9 回答 9

44

我从Java 教程中找到了这个

  • 实例方法可以直接访问实例变量和实例方法。
  • 实例方法可以直接访问类变量和类方法。
  • 类方法可以直接访问类变量和类方法。
  • 类方法不能直接访问实例变量或实例方法——它们必须使用对象引用。此外,类方法不能使用 this 关键字,因为没有实例可供 this 引用。

所以答案是肯定的,非静态方法可以修改静态变量

于 2014-03-04T20:40:32.617 回答
17

No, any non-static method has access to static members. The only way this would be false is if the non-static context did not have access to the static member (ex. the static member is private to a class and the non-static code is not in that class). static variables exist to provide an instance free variable/method, so for example if we have a Game class and a highscore variable, the highscore would be static (accessible without an instance), and after every game (an instance of the Game class) completes we could alter the highscore from our non-static context if our score is greater than the high score.

于 2013-06-21T19:14:59.543 回答
6

非静态方法可以访问静态变量。静态方法只能直接访问静态变量或方法,无需创建object.ex:public static void main(String arg[])

于 2015-07-06T10:04:36.393 回答
1

非静态方法可以访问静态变量和静态方法,因为它们是类的成员

演示代码

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();

    }
}
于 2016-06-17T07:23:52.243 回答
0

这样看。可以通过多种方式访问​​静态变量。最常见的一种方法是在 var 名称之前加上类名,因为静态变量是每个类的。由于您在同一类中引用此变量,因此您不必在其前面加上类名。在哪里调用静态变量并不重要。这也是任何其他类都无法访问的私有静态变量。

于 2013-06-21T19:50:20.190 回答
0

静态方法不能修改非静态字段,因为 - 对于使用非静态字段(在类外部),您必须实例化一个类对象,但是对于使用静态方法,根本不需要对象实例化。这就是为什么非静态方法(不需要对象实例化)修改应该实例化的字段是不合理的。

为此 - 静态方法只能接触静态字段(或调用其他静态方法)。

但是正如您提到的相反,非静态方法可以修改一个静态字段,该字段对其类的所有对象都是静态的。

于 2014-07-05T13:01:22.247 回答
0

静态变量是类变量而不是实例或局部变量。这就是为什么我们也可以在非静态方法中使用静态变量的原因。和静态变量不是每个对象。静态变量只有一份副本,将在整个程序中使用。

于 2015-05-18T09:41:24.893 回答
0

静态成员不是实例成员,它们是由类共享的,所以基本上任何实例方法都可以访问这些静态成员。

于 2016-01-26T07:49:36.803 回答
-1

是的,静态方法可以访问非静态变量。这是通过为类创建一个对象并通过该对象访问变量来完成的。在下面的示例中,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);
   }
}   
于 2017-02-02T00:14:22.263 回答