在Java中,new MyClass()
creates a new instance的MyClass
並返回對其的引用。
同時,聲明:
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
構造函數有一些你想觸發的副作用。但是由於構造函數通常被認爲是不好的風格,所以不會有任何非平凡的副作用(或者更一般地說,除了設置新對象之外,除了做其他事情外),你通常不應該有任何藉口來編寫這樣的代碼。
如何知道對象是否已經創建? – foobar5512 2012-01-06 22:41:31
當您嘗試引用它時,它將爲空。你可以通過類似的東西來檢查(參考我的更新) – AedonEtLIRA 2012-01-06 22:42:29
你從文檔或經驗中獲得這些信息。例如經理經常被用作單身人士(或類似的),所以只有一個實例。這種你不創建的類,但有一個函數來檢索對象。 – 2012-01-06 22:44:23