2010-05-12 60 views
0

我有一个Java类,其中每个方法被定义为static。所以我不必重写类,然后取决于它的好几个代码,我通过实例变量添加了一些错误报告。但是,Java似乎无法从类方法访问实例变量。我阅读了Sun的description类变量,并且谨慎地将每个方法都改为此类中的实例方法,而不会更好地理解它在Web应用程序中的工作方式。Java类和实例变量Web应用程序中的内存使用情况?

根据(1),据我所知,类方法共享的对象的所有实例相同的存储位置。那么,在一个Web应用程序中,这是不是意味着每个进程都为静态方法引用相同的内存地址?而且,每个进程又会重新定义所有的实例方法?

如果我要创建一个类变量来跟踪的错误,那不是引入的情况下处理一个可能引发进程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; 
} 

回答

2

类方法共享相同的存储位置为对象

所以做实例方法的所有实例。一个类的所有方法的代码只存在一次。区别在于实例方法总是需要一个实例(及其字段)用于上下文。

如果我要创建一个类变量 跟踪误差的,那不是 引入的情况下处理的 可能引发进程B的错误? 实例方法是否可以访问类变量 ?

是的,是的。这就是为什么非最终静态字段通常被认为是不好的事情。

+0

“这就是为什么有静态字段通常被认为是一个坏事情。” ...除了“常量”(最终基元/不可变),它们是只读的。 – leonbloy 2010-05-12 15:08:13

+0

因此,如果我要重新声明所有的方法作为实例方法(删除静态关键字),那么我不会招致内存损失?也就是说,每个新的页面请求都不需要比静态方法更多的内存。 – 2010-05-12 15:14:37

+0

@jsumners:这将需要你创建至少一个实例,这需要约8个字节加上你定义的任何实例字段 - 换句话说,不值得担心。 – 2010-05-12 15:20:02

0

保持静态私有实例

class Foo { 
    private static Foo myInstance = new Foo(); 

    public static void MyPretendInstanceMethod() { 
     myInstance.doBar(); 
    } 

    private void doBar() { 
     // do stuff here 
    } 

} 

添加必要的同步。

0

静态方法只能访问静态类变量。他们不能访问实例变量,因为静态方法不绑定到类的任何特定实例。

你不需要为了访问静态成员变量或创建一个类的新实例(只要它是公共的)。在你的例子中,你可以像这样调用methodB:

String bString = MyClass.methodB(); 

正如你所看到的,没有新的实例必须被创建。

但因为了methodA也不是一成不变的,你必须创建类的实例,以调用它,就像你在你的例子一样:

MyClass myClass = new MyClass(); 
String aString = myClass.methodA(); 
相关问题