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