2012-01-06 71 views
8

何時需要在Java中使用new關鍵字。我知道你應該使用它,當你創建一個這樣的對象的實例:什麼時候適合使用'new'關鍵字?

TextView textView = new TextView(this); 

有時候在代碼中,我注意到,new不使用,我弄糊塗.. 在這一行的代碼:

AssetManager assetManager = getAssets(); 

爲什麼不AssetManager的一個實例是這樣創建的:

AssetManager assetManager = new AssetManager(); 

然後將其設定爲等於getAssests()?

什麼時候應該使用new

謝謝!

回答

9

第一次顯式創建對象時,使用new關鍵字。然後使用getter方法獲取對象new不是必需的,因爲對象已經存在於內存中,因此不需要重新創建。

,如果你想新的訪問the oracle docs

的對象將需要「新」的關鍵字,如果它爲空(這是看中了未初始化)的更詳細的說明。

編輯:

這將始終打印「需要新的」在目前情況下。

Object mObj = null; 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 

OUTPUTS: needs new 

因此,要解決它,你會做這樣的事情:

Object mObj = new Object(); 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 
OUTPUTS: does NOT need new 

而且在那種情況下,我們總會看到「不需要新的」

+0

如何知道對象是否已經創建? – foobar5512 2012-01-06 22:41:31

+0

當您嘗試引用它時,它將爲空。你可以通過類似的東西來檢查(參考我的更新) – AedonEtLIRA 2012-01-06 22:42:29

+1

你從文檔或經驗中獲得這些信息。例如經理經常被用作單身人士(或類似的),所以只有一個實例。這種你不創建的類,但有一個函數來檢索對象。 – 2012-01-06 22:44:23

2

使用new您分配內存物體。使用getXXX()用於獲取已分配的現有對象。

2

當您調用函數的構造函數時會使用這個新函數。 getAssets()返回一個AssetManager,它不需要創建一個新的。

2

既然你用[android]標記了這個,我猜你的代碼是ActivityService。在這種情況下,getAssets()是您正在擴展的類的一種方法。所以你實際上並沒有創建它,你要求現有的代碼給你一個已經存在的參考。

0

注意TextView中的大寫字母,以及getAssets中缺少它。 getAssets不是像TextView這樣的類,它是一種返回對象的方法。和其他許多人一樣,您的資產已經存在。

5

在java中,你總是必須使用new實例化對象(幾乎總是)。隨着getAssests()您檢索一個已經創建一個。我想你的問題來自C++,其中new分配動態內存,但由於Java只有動態對象,總是需要新的。

3

new始終用於創建新對象。

AssetManager assetManager = getAssets(); 

剛剛分配從方法getAssets()返回到參考assetManager的值。

[編輯]

我撒謊new也可以做這樣的事情:

Foo.class.newInstance(); 

,你也可以使用反射:

Foo.class.getDeclaredConstructors(Class[] parameterTypes).newInstance(arguments); 
1

在Java中,new MyClass()creates a new instanceMyClass並返回對其的引用。

同時,聲明:

MyClass foo; 

定義一個變量foo可存儲的MyClass的實例,或者指示不存在這樣的參考的特殊值null的參考。如果您沒有對foo進行任何參考,則其默認值爲null

你當然可以結合這些東西,例如像這樣:

MyClass foo;   // define a variable foo that can store an object reference 
foo = new MyClass(); // create a new object and assign a reference to it to foo 

,或者等價地,像這樣:

MyClass foo = new MyClass(); // combined variable definition and assignment 

但你不在每次分配的東西給一個參考變量的時間創建一個新的實例。你也可以做例如這樣的:

MyClass foo, bar;  // define two reference variables, foo and bar 
foo = new MyClass(); // create a new object and assign a reference to it to foo 
bar = foo;    // now foo and bar point to the same object 

甚至:

MyClass foo = new MyClass(), bar = foo; // same, but shorter 

注意,在Java中,而不是像C++其他一些語言,你永遠無法分配(副本)的實際對象到一個變量。相反,Java對象總是通過引用來訪問它們。當有人談到Java中的「將對象指定給變量」或「將對象作爲參數」或「從方法返回對象」時,他們總是實際上指的是將參考指定或傳遞或返回給目的。


您的代碼調用的方法可以(並且經常)也返回對對象的引用。例如,如果你的班有這樣的方法:

private MyClass getSomeObject() { 
    // ...some code here... 
} 

你可以調用它,它返回引用保存到這樣一個變量:

MyClass foo; 
foo = getSomeObject(); 

或像這樣:

MyClass foo = getSomeObject(); 

我們可以從方法聲明中知道getSomeObject()將始終返回對MyClass實例(或null)的引用,但不會在第實際上來自於。這完全取決於getSomeObject()方法中的代碼的作用。每次調用代碼時,代碼可能總會創建一個新的MyClass實例,並返回對其的引用,或者它可能始終返回對同一對象的引用。或者,當然,它有時可能會返回對新對象的引用,有時會返回到之前創建的對象。


請注意,如果您爲變量指定一個新值,無論之前包含的變量將被遺忘。如果遺忘值恰好是某個對象的最後一個引用,那麼該對象本身將被Java的垃圾收集器銷燬。

因此,舉例來說,雖然它肯定可能做這樣的事情:

MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo 
foo = getSomeObject();  // forget the previous content of foo and replace it with whatever getSomeObject() returns 

,通常是沒有意義的,因爲你會創建一個新的MyClass的實例就是立即扔掉你的只參考它並用其他東西代替它。實際上,上面的代碼是完全等同於:

new MyClass();  // create a new object and throw away(!) the reference to it 
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo 

唯一的一次,甚至可以遠程意義的是,如果你想創建一個新的MyClass實例,並立即讓它被垃圾收集,例如因爲MyClass構造函數有一些你想觸發的副作用。但是由於構造函數通常被認爲是不好的風格,所以不會有任何非平凡的副作用(或者更一般地說,除了設置新對象之外,除了做其他事情外),你通常不應該有任何藉口來編寫這樣的代碼。

相關問題