非静态方法可以修改静态变量吗

问题描述 投票:0回答:10

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

public class SampleClass {
  private static int currentCount = 0;

  public SampleClass() {
    currentCount++;
  }

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

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

java methods static instance-variables access-modifiers
10个回答
45
投票

我从Java教程

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

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


17
投票

不,任何非静态方法都可以访问静态成员。唯一的错误是,如果非静态上下文无法访问静态成员(例如,静态成员是类的私有成员,并且非静态代码不在该类中)。静态变量的存在是为了提供一个实例自由变量/方法,因此,例如,如果我们有一个 Game 类和一个 highscore 变量,则 highscore 将是静态的(无需实例即可访问),并且在每次游戏之后( Game 类的实例)完成后,如果我们的分数大于高分,我们可以从非静态上下文中更改高分。


6
投票

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


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

    }
}

0
投票

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


0
投票


0
投票

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

但正如你提到的,相反的方式也是可能的, 非静态方法可以修改静态字段,该字段对于其类的所有对象都是静态的。


0
投票


0
投票

补救措施是使非静态方法同步或仅从静态方法更新静态变量。


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

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.