2014-04-24 19 views
4

創建一個有或沒有「new」的對象有什麼區別?使用「new」創建的java對象和不使用「new」的java對象有什麼區別

例如:

Thing someThing = new Thing(); 

Path filePath = Path.get("C:\\......) 

在第一示例據我所知,實例化對象,即「新」是分配存儲器用於所述對象的東西和存儲器時位置由someThing引用。

我的課本使用第二個例子說「你創建一個Path對象」。不同之處在於對象是如何存儲或分配內存的?我不知道你爲什麼要這樣創建一個對象。

+0

你有沒有試過尋找這裏問路徑之間的路徑的源代碼? –

回答

6

沒有區別。第二個例子是工廠方法。

您傳遞了幾個參數,該方法將在Path的實際實例類的某個點上調用new

12

在第二種情況下,您正在使用內部創建對象或將引用傳遞給現有對象的靜態方法。這是一種常見模式,特別是當API希望隱藏內部實現時(這裏就是這種情況)。

+4

要明確的是,'Path.get'方法幾乎可以肯定在其實現的某個地方調用'new'。 –

+1

靜態方法不一定要創建對象,它可能會被存儲並且您只是檢索其引用。在提供的例子中情況並非如此。 – DSquare

+0

@DSquare,true。我更新答案以包含詳細信息。謝謝! –

1

當您使用新的關鍵字時,則會創建特定類的對象。

這裏Thing someThing = new Thing(); 東西事情類的一個對象

Path filePath = Path.get("C:\......) 

路徑是具有靜態方法get()其接受字符串參數的類,並將其返回路徑類似

public static Path get(String arg) 
{ 
return path; 
} 
0

內存由第二個實例中的方法調用分配給Path.get。這允許庫通過它自己的初始化例程來獲得Path變量,並且可以執行額外的檢查。新只是分配內存。內存也可以在某些結構中進行內部排序和存儲,這樣它就不會經常通過緩存重新加載相同的對象。我個人總是調用工廠方法,而不是自己新建一個對象,但它可以被認爲是一種風格的東西,因爲幾乎所有可能用工廠方法完成的事情都可以通過構造函數來實現。

4

雖然它的行爲類似於構造函數,但也應該指出不同之處:靜態工廠方法不必返回當前類型,但也可以返回一個子類型,而構造函數創建一個實例當前課程。 (假設)示例:

public static Path create(String name) { 
    return new AbsolutePath(name); // subclass/implementation of Path 
} 

從實現的角度來看,這爲後續擴展提供了很大的靈活性。你可以例如實現一些邏輯,它決定了在方法中創建哪個具體類型。你可以緩存實例並返回它們。你可以每次都返回同一個實例(Singleton)。等等。

進一步方面:實際上,你可以給出有意義的名稱,以靜態工廠方法,使代碼更容易閱讀:

public static Path createAbsolute(String name) { ... } 
public static Path createRelative(String name) { ... } 
2

隨着你確信你正在創建一個新的對象(或多或少的第一個選項, java.lang.* CLASSE有點特殊) 讓我們的第二個選項:

Path filePath = Path.get("C:\\......) 

沒有向你保證,你在文件路徑的存儲是路徑之一,例如,它可以是路徑的一個子類的實例。同樣的事情也有發生的日曆:日曆是一個抽象類,所以

Calendar c=Calendar.getInstance(); 

變量c實際上是一個GregorianCalendar

另一個不同之處:

class Singleton { 

    private Singleton s=null; 

    private Singleton(){}; 

    public static Singleton getSingleton() { 
     if (s==null) { 
      s=new Singleton(); 
     } 
     return s; 
    } 
} 

不管你有多少次打電話getSingleton,你只會創建一個對象。

0

在你的例子中,你假設一個沒有「新」的對象被創建。這是一個不正確的假設。在第二個例子中,該對象也是用「new」創建的。

僅僅因爲你看不到「新」並不意味着它沒有在函數中調用。

相關問題