2013-06-21 83 views
18

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

public class SampleClass { 
    private static int currentCount = 0; 

    public SampleClass() { 
    currentCount++; 
    } 

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

此代码编译,我想知道为什么在静态访问privledges方面。

+6

你尝试了吗? –

+1

@Marco是的,它编译。只是想知道人们是否在任何地方记录了这一点,以及我的推理是否正确。 –

+2

静态方法不能修改实例变量并不是真的。只是他们没有任何隐含的“这个”引用。你可以写'class Ex {private int x; static void fn(Ex ex){ex.x = 12; }}。顺便说一句:可变静力学通常是一个坏主意。 –

回答

23

我发现这个从The Java Tutorials

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

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

15

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

+0

谢谢你的男人。我不知道私人事情,我在这里头疼...... –

0

这样看。静态变量可以通过多种方式访问​​。最常见的一种方法是在var名称前加上类名,因为静态变量是每个类的。 由于您在同一个班级中引用了此变量,因此您可以免除必须在之前加上班级名称。你调用静态变量的地方并不重要。 此外,这是一个私人静态变量不能被任何其他类访问。

0

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

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

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

0

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

5

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

+0

没有*使用*对象。它可以作为参数提供。 – EJP

0

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

0

非静态方法可以访问,静态变量&静态方法,因为他们类的成员

Demo Code

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

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