代码之家  ›  专栏  ›  技术社区  ›  James Sumners Gavriel

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

  •  0
  • James Sumners Gavriel  · 技术社区  · 14 年前

    我有一个Java类,其中每个方法都被定义为 static . 为了不必重新编写类,然后再编写一些依赖它的代码,我通过一个实例变量添加了一些错误报告。但是,Java似乎无法从类方法访问实例变量。我读过Sun的小说 description 对于类变量,在没有更好地理解它在Web应用程序中的工作方式的情况下,要谨慎地将类中的每个方法都更改为实例方法。

    根据( 1 ,据我所知,类方法为对象的所有实例共享相同的内存位置。所以,在Web应用程序中,这是否意味着每个进程都引用静态方法的相同内存地址?反过来,每个进程都会重新定义所有的实例方法?

    如果我要创建一个类变量来跟踪错误,这会不会引入一种情况,流程A会触发流程B中的错误?实例方法甚至可以访问类变量吗?

    编辑:

    让我用一些示例代码来说明我要完成的工作。

    首先,我的班级:

    public class MyClass {
      public int error = 0;

    公共字符串methoda()。{ //做些事情 如果(ret==null),则this.error=1; 返回RET; }

    公共静态布尔方法b()。{ //相同,但我无法访问此。此处出错 } }

    现在我的申请:

    MyClass myClass = new MyClass();
    String aString = myClass.methodA();
    if (myClass.error != 0) {
      out.print("What did you do!?");
      return;
    }
    

    3 回复  |  直到 14 年前
        1
  •  2
  •   Michael Borgwardt    14 年前

    类方法为对象的所有实例共享相同的内存位置

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

    如果我要创建一个类变量 为了跟踪错误,不是吗? 介绍过程A 是否会触发进程B中的错误? 实例方法甚至可以访问类吗 变量?

    是的,是的。这就是为什么拥有非最终静态字段通常被认为是一件坏事。

        2
  •  0
  •   corsiKa    14 年前

    保留静态私有实例

    class Foo {
        private static Foo myInstance = new Foo();
    
        public static void MyPretendInstanceMethod() {
            myInstance.doBar();
        }
    
        private void doBar() {
            // do stuff here
        }
    
    }
    

    根据需要添加同步。

        3
  •  0
  •   Michael    14 年前

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

    您不需要创建类的新实例来访问静态成员或变量(只要它是公共的)。在您的示例中,可以这样调用methodb:

    String bString = MyClass.methodB();
    

    如您所见,不必创建新实例。

    但是,由于methoda不是静态的,因此必须创建类的实例才能调用它,就像在示例中那样:

    MyClass myClass = new MyClass();
    String aString = myClass.methodA();