簡體   English   中英

以這兩種方式創建對象有什么區別?

[英]What is the difference between creating an object in these two way?

我想知道這些之間的區別是什么:

1-)

JFrame frame = new JFrame();
JLabel label = new JLabel("example");
frame.add(label);

2-)

JFrame frame = new JFrame();
frame.add(new Label("example"));

另外,我們可以使用如下語法:

1-)

new Timer(10, new ActionListener() {...}).start();

但為什么我們不能像這樣使用它:

2-)

Timer timer = new Timer(10, new ActionListener() {...}).start(); // we cannot use it this way it has to be like:

//Timer timer = new Timer(10, new ActionListener() {...});
//timer.start();

這兩者之間的區別是這樣的,

如果在將參數變量作為參數發送給方法時不需要引用變量,則可以在調用方法時直接生成對象。

喜歡這個frame.add(new Label("example"));

但是如果你確實要求你將作為參數傳遞的對象,那么最好有它的引用變量,這樣你就可以在代碼中用它做一些事情,

假設您想要在方法完成任務后更改某個實例變量或獲取Object狀態。 在這種情況下,您需要引用變量到Object

Ramanlfc給出了你的另一個問題的回答

其中說new Timer(10, new ActionListener() {...}).start();

這可以在這里忽略方法返回類型,這個任務將在語句發布時完成,

Timer timer = new Timer(10, new ActionListener() {...}).start(); 

這是不可能的,因為start()不返回Timer ,其被分配給Timer參考變量

Timer timer = new Timer(10, new ActionListener() {...}).start();

賦值是從右到左,所以你的表達式求值應該可以賦值給=左邊的操作數。 在這種情況下, start()不會返回Timer ,因此失敗。

在前面的兩個示例中,您將創建一個JFrame並將其分配給JFrame變量。 與標簽相同。

Timer timer = new Timer(10, new ActionListener() {...}).start();

因為返回類型不會起作用

start();

是無效的。

new Timer(10, new ActionListener() {...}).start();

之所以有效,是因為您從未嘗試將void返回值分配給Timer。

其他答案是正確的。

另一種思考方式是調用new JLabel立即在內存中創建JLabel對象。 只有在構造之后,對象才會被分配給您的JLabel label變量。 label變量不是您的JLabel對象。 它是一個引用,可以將我們帶到JLabel對象的名稱。 JLabel對象本身在內存中浮動。

宇航員系繩

JLabel對象就像太空行走上的宇航員。 將該對象分配給label變量就像將宇航員的系繩末端放在手中一樣。 使用該label變量就像拉扯該系繩以獲得宇航員一樣。

您的備用代碼將對JLabel對象的引用傳遞給JFrame對象。 同樣,在切換到JFrame 之前 ,JLabel對象已經完整且完整地存在 在交接之后,本地代碼已經“忘記”了JLabel。 沒有本地引用變量意味着無法返回JLabel對象。 JLabel對象在某些地方仍然存在於內存中,但是我們的本地代碼無法訪問。 在我們的太空行走類比中,將參考文獻交給JFrame就像將宇航員的繩索交給其他人一樣。

如果我們保留一個本地JLabel參考變量傳遞給JFrame,那就像把我的太空行走的宇航員連接兩條繩索。 在將第二個系繩傳遞給其他人(JFrame對象)時,您手持一條系繩(局部變量)。

如果所有引用都設置為null或超出范圍,那就像釋放所有系繩到我們的宇航員。 該對象仍然存在於內存中一段時間​​,但成為垃圾收集的候選對象。 實際從內存中刪除發生在垃圾收集器運行時,並決定是時候回收該內存空間。

暫無
暫無

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

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