Web应用程序中的Java类和实例变量内存使用情况?

时间:2010-05-12 14:48:17

标签: java memory-management

我有一个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;
}

3 个答案:

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