[英]Why an instance of anonymous class can be assigned to an Interface variable?
[英]In Java why is the New instance of a class not assigned to a variable
Java 初學者。 我已經多次看到下面的行並且無法理解它...... new TestCode()
- 它似乎是一個實例,但沒有分配給任何東西 - 那么如何引用它呢?
class TestCode
{
public TestCode()
{
System.out.println();
System.out.println( "Welcome to the Program");
}
public static void main( String args[] ){new TestCode();}
}
它不能被引用。 新實例被創建並立即丟棄。
然而,它的構造函數代碼被調用,因此會發生副作用(如果有的話——在你的例子中有——它會打印到標准輸出)。 然而,做這樣的事情是一種不好的做法。
請參閱 Zaki 關於將其分配給變量的答案。 然后你可以參考它,做一些事情。
當你通過new
代碼字實例化一個對象時,堆上的空間(用於存儲對象及其字段的系統內存部分)被分配,並且構造函數被執行。 在這種情況下,構造函數寫入標准輸出,無論是否創建對對象的引用,都會執行此操作。
之后,您是對的,由於不存在對它的引用,因此無法訪問該對象。 因此垃圾收集器最終會釋放內存空間。
正如亞當所說,這通常是不鼓勵的,因為它破壞了您的期望,即構造函數應該初始化對象,並且應該可以通過其方法與外部世界進行交互。
因此,即使它有點長,更好的結構化代碼也可能如下所示:
class TestCode {
public TestCode() {}
public void welcome() {
System.out.println();
System.out.println("Welcome to the Program");
}
public static void main( String args[] ){
TestCode tc = new TestCode();
tc.welcome();
}
}
PS當然,在某些情況下,您可能希望在每次實例化時都在實例之外進行操作,例如,保留類的所有實例的靜態列表,因此每次構造時都將特定實例添加到其中. 盡管如此,最好創建一個私有的 init() 方法並從構造函數調用它,以便更好地分離具有不同功能的元素。
再舉一個例子,這里有一種不同的、功能相同的方式可以重新編寫您的代碼:
class TestCode {
public TestCode() {
init();
}
private void init() {
System.out.println();
System.out.println("Welcome to the Program");
}
public static void main( String args[] ){
TestCode tc = new TestCode();
// Or simply: new TestCode();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.