我想知道非静态方法如何修改静态实例变量。我知道静态方法只能访问其他静态方法和静态变量。但是,另一方是真的吗?非静态方法可以只访问非静态变量吗?例如:
public class SampleClass {
private static int currentCount = 0;
public SampleClass() {
currentCount++;
}
public void increaseCount() {
currentCount++;
}
}
此代码编译,我想知道为什么在静态访问权限方面。
答案 0 :(得分:36)
所以答案是肯定的,非静态方法可以修改静态变量
答案 1 :(得分:17)
不,任何非静态方法都可以访问静态成员。唯一的方法是假如果非静态上下文不能访问静态成员(例如,静态成员对类是私有的,而非静态代码不在该类中)。存在静态变量以提供实例自由变量/方法,例如,如果我们有一个Game类和一个highscore变量,则highscore将是静态的(可以在没有实例的情况下访问),并且在每个游戏之后(Game类的一个实例)如果我们的分数高于高分,我们可以改变非静态背景的高分。
答案 2 :(得分:6)
非静态方法可以访问静态变量。 静态方法只能直接访问静态变量或方法而无需创建object.ex:public static void main(String arg [])
答案 3 :(得分:0)
以这种方式看待它。可以通过多种方式访问静态变量。其中最常见的是在var名称前加上类名,因为静态变量是每个类。 由于您在同一个类中引用此变量,因此您可以免除必须在其前面加上类名。在哪里调用静态变量并不重要。 此外,这是一个私有静态var,任何其他类都无法访问。
答案 4 :(得分:0)
静态方法无法修改非静态字段,因为 - 对于使用非静态字段(在类外),必须实例化一个类对象, 但是对于使用静态方法,根本不需要对象实例化。 这就是为什么非静态方法(不要求对象实例化)不合理的原因 修改应该实例化的字段。
为此 - 静态方法只能触摸静态字段(或调用其他静态方法)。
但正如你提到的另一种方法是可能的, 非静态方法可以修改静态字段,该静态字段对于其类的所有对象都是静态的。
答案 5 :(得分:0)
静态变量是类变量而不是实例或局部变量。这就是为什么我们也可以在非静态方法中使用静态变量。和静态变量不是每个对象。静态变量有一个副本将在整个程序中使用。
答案 6 :(得分:0)
静态成员不是实例成员,它们由类共享,因此基本上任何实例方法都可以访问这些静态成员。
答案 7 :(得分: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();
}
}
答案 8 :(得分: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);
}
}