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

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

public class SampleClass { private static int currentCount = 0; public SampleClass() { currentCount++; } public void increaseCount() { currentCount++; } } 

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

我从The Java Tutorials中找到了这个

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

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

不,任何非静态方法都可以访问静态成员。 唯一的方法是假的是非静态上下文无法访问静态成员(例如,静态成员对类是私有的,而非静态代码不在该类中)。 存在静态变量以提供实例自由变量/方法,例如,如果我们有一个Game类和一个highscore变量,则highscore将是静态的(可以在没有实例的情况下访问),并且在每个游戏之后(Game类的一个实例)如果我们的分数高于高分,我们可以改变非静态背景的高分。

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

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

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

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

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

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

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

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

演示代码

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

是的,静态方法可以访问非静态变量。 这是通过创建类的对象并通过对象访问变量来完成的。 在下面的示例中, 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); } }