2017-05-30 56 views
-6
class test { 

    public static void main(String[] args) throws java.lang.Exception { 
     new Animal(); 
    } 
} 

class Animal { 

    Animal() { 
     System.out.println("sound! sound!"); 
    } 
} 

這段代碼是如何編譯的,因爲我們知道,如果不使用引用變量來創建一個類,我們不能單獨使用new運算符,這裏我只提到「new Animal();」並且構造函數沒有任何錯誤地執行,怎麼樣??這段代碼如何編譯並運行?

+5

「我們知道,如果沒有使用引用變量的類,我們不能單獨使用new操作符」 - 也許我們_don't_知道 – khelwood

+1

它不是必需的存儲對象'在new'回報變量。 – Jesper

+1

請讓我們知道什麼愚蠢的網站說,你不能單獨使用'new'算子,所以我們都可以恥辱它存在。 – Andreas

回答

3

你說:

我們知道,如果沒有使用引用變量的類,我們不能單獨使用 新的運營商

可以。結果對象引用不會被分配給任何東西,並且分配/實例化的對象不能被進一步訪問。請注意,如果沒有持有引用,實例化的Animal對象將成爲立即垃圾回收的候選對象(儘管main()將立即在您的示例中退出)

1

您可以儘可能多地做new Animal();,唯一的是你創建對象,但沒有引用,你以後可以用與對象工作...

所以這個:

public static void main(String[] args) { 
    new Animal(); 
} 

是好的,它編譯和運行沒有問題


這裏只是從JDK採取一個例子:

DateFormat

public final String format(Date date) 
{ 
    return format(date, new StringBuffer(), 
        DontCareFieldPosition.INSTANCE).toString(); 
} 

一個StringBuffer對象是匿名的創建和傳遞給格式化方法...

0

只是因爲你沒有把你的new Animal()分配給一個變量,這並不意味着它不會被初始化。

你只是不能使用它或再次引用它。

+2

除非它在全局內存中存儲對自身的引用(壞主意,但有人可能在某個時候做過)。 – Andreas