簡體   English   中英

引用變量上的調用方法 vs 新對象上的調用方法

[英]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-1method-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();
  1. 創建 A 的新實例。
  2. 將對其的引用存儲在變量a1
  3. 在我們的實例上調用doThis()

new A().doThis(); 讀作:

  1. 創建 A 的新實例。
  2. 在我們的實例上調用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.

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