[英]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.