我有一个Java类,其中每个方法都定义为static
。因此,我不必重新编写类,然后是依赖它的一些代码,我通过实例变量添加一些错误报告。但是,Java似乎无法从类方法访问实例变量。我阅读了Sun的description类变量,并且警惕只是将每个方法更改为此类中的实例方法,而无需更好地理解它在Web应用程序中的工作方式。
根据(1),据我所知,类方法为对象的所有实例共享相同的内存位置。因此,在Web应用程序中,这不意味着每个进程都引用静态方法的相同内存地址吗?反过来,每个进程都会重新定义所有实例方法?
如果我要创建一个类变量来跟踪错误,那么是否会引入进程A可能在进程B中触发错误的情况?实例方法甚至可以访问类变量吗?
编辑:
让我通过一些示例代码澄清我想要完成的任务。
首先,我的班级:
public class MyClass {
public int error = 0;
public String methodA() {
// Do some stuff
if (ret == null) this.error = 1;
return ret;
}
public static boolean methodB() {
// Same thing but I can't access this.error here
}
}
现在我的申请:
MyClass myClass = new MyClass();
String aString = myClass.methodA();
if (myClass.error != 0) {
out.print("What did you do!?");
return;
}
答案 0 :(得分:2)
类方法为对象的所有实例共享相同的内存位置
实例方法也是如此。类的所有方法的代码只存在一次。不同之处在于实例方法总是需要一个实例(及其字段)用于上下文。
如果我要创建一个类变量 为了跟踪错误,不会那样 介绍进程A的情况 可能会在流程B中触发错误? 实例方法甚至可以访问类 变量
是的,是的。这就是为什么非最终静态字段通常被认为是坏事。
答案 1 :(得分:0)
保留静态私有实例
class Foo {
private static Foo myInstance = new Foo();
public static void MyPretendInstanceMethod() {
myInstance.doBar();
}
private void doBar() {
// do stuff here
}
}
根据需要添加同步。
答案 2 :(得分:0)
静态方法只能访问静态类变量。它们无法访问实例变量,因为静态方法不依赖于类的任何特定实例。
您无需创建类的新实例即可访问静态成员或变量(只要它是公共的)。在您的示例中,您可以像这样调用methodB:
String bString = MyClass.methodB();
如您所见,不必创建新实例。
但是因为methodA不是静态的,所以你必须创建一个类的实例才能调用它,就像你在例子中所做的那样:
MyClass myClass = new MyClass();
String aString = myClass.methodA();