簡體   English   中英

Web應用程序中Java類和實例變量的內存使用情況?

[英]Java class and instance variables memory usage in a web application?

我有一個Java類,其中每個方法都定義為static 為了不必重新編寫該類,而不必重新編寫依賴於該類的代碼,我通過實例變量添加了一些錯誤報告。 但是,Java似乎無法從類方法訪問實例變量。 我閱讀了Sun對類變量的描述 ,並警惕僅將此類中的每個方法更改為實例方法,而沒有更好地了解它在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;
}

類方法為對象的所有實例共享相同的內存位置

實例方法也是如此。 一個類的所有方法的代碼僅存在一次。 不同之處在於實例方法始終需要實例(及其字段)作為上下文。

如果我要創建一個類變量來跟蹤錯誤,這是否會導致流程A可能在流程B中觸發錯誤的情況? 實例方法可以訪問類變量嗎?

是的,是的。 這就是為什么通常將非最終靜態字段視為壞事的原因。

保留靜態私有實例

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

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

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

}

根據需要添加同步。

靜態方法只能訪問靜態類變量。 它們無法訪問實例變量,因為靜態方法未綁定到該類的任何特定實例。

您無需創建類的新實例即可訪問靜態成員或變量(只要它是公共的)。 在您的示例中,您可以像這樣調用methodB:

String bString = MyClass.methodB();

如您所見,無需創建新實例。

但是由於methodA不是靜態的,因此您必須創建該類的實例才能對其進行調用,就像在示例中所做的那樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM