[英]Calling methods on reference variable vs Calling methods on a new object
我在調用非靜態方法時感到困惑
class A {
void doThis() {}
public static void main(String... arg) {
A a1 = new A();
a1.doThis(); // method - 1
new A().doThis(); // method - 2
}
}
我知道method-1和method-2都會調用doThis() ,但是有什么功能上的區別嗎?
這些方法的執行不會有任何區別,但在new A().doThis()
的情況下,您將丟失對調用該方法的對象實例的引用,而您不會能夠在您的代碼中進一步使用它。 此方法對實例內部狀態所做的所有更改都將丟失。
如果A a1 = new A(); a1.doThis();
A a1 = new A(); a1.doThis();
您將保留對象的實例(在變量a1
)以及方法doThis()
對其狀態所做的潛在更改。 然后您將能夠繼續使用該對象。
讓我們看看代碼用簡單的英語怎么說:
A a1 = new A();
a1.doThis();
a1
。doThis()
。 而new A().doThis();
讀作:
doThis()
。 所以唯一的區別是你是否將它存儲在局部變量中。 如果您不再使用變量中的值,那么這種差異無關緊要。 但是如果你想在同一個對象上調用另一個方法,比如a1.doThat()
,那么你在第二個解決方案中遇到了麻煩,因為你不再有對原始實例的引用。
為什么要使用相同的對象? 因為方法可以改變對象的內部狀態,這幾乎就是對象的意義所在。
有什么功能上的區別嗎?
兩者的行為方式相同。
第二個選項不允許您再次重用該實例。 在單行 return 語句中可能既方便又簡潔(例如,考慮構建器模式,其中每個構造方法都返回一個半初始化的實例):
return new Builder().a().b().build();
或者如果創建一個對象只是為了執行一次定義的操作。
方法 2 中新對象的引用是什么?
它不再存在(更准確地說,我們無權訪問它),除非doThis
返回this
您可以在方法執行后將其放入變量中。
我可以說 method-2 是調用非靜態方法的不正確方式嗎?
不。如果以后永遠不會使用這個變量,我們為什么要創建一個變量?
讓我們一一看看這兩種方法。
方法一
A a1 = new A();
a1.doThis();
在方法 1 中,您有A
的新創建實例的引用,即a1
並且您可以使用此引用a1
在此A
實例上調用盡可能多的方法。 基本上,您可以通過使用a1
的引用來重用A
的特定實例。
方法二
new A().doThis();
但是,在method-2 中,您沒有任何變量來存儲新創建的A
實例的引用。 你將如何指的是特定實例A
,如果你要呼吁的是特定實例的任何其他方法A
? 如果您使用方法 2 創建一個實例,您將無法重新使用A
該實例,並且一旦使用該實例,您就會丟失該實例。
情況1:
A a1 = new A();
a1.doThis();
上面兩行表示創建的對象和doThis(); 已執行但在堆內存中仍然可用的對象。
案例2:
new A().doThis();
創建了一個類對象並doThis();
GC(GarbageColletor) 將激活后立即執行以從堆內存中刪除 A 對象,因為它是一個非引用對象,我們可以將此對象稱為匿名對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.