2016-04-15 122 views
0

如果我錯了,請糾正我,我只是想澄清一下,我理解這個權利。對象參考澄清

當你在java中創建一個對象時,你使用new關鍵字,然後是類類型。防爆。 new [someclassnamehere](); 根據您的構造函數,您可以在創建對象時通過在參數中提供參數來傳遞參數。

我不確定是否僅僅通過使用new關鍵字創建一個新對象o的代碼行是有用的,因爲沒有任何內容實際上持有對該信息的引用。但它似乎是正確的。

因此,您可以使用type name創建一個變量,其中包含對正在創建的新對象的引用。例如:Employee someData;。但它還沒有真正引用一個對象,看到一個還沒有被創建。因此,通過應用上面討論的信息: Employee someData = new Employee(name); 我們現在創建了一個Employee object,其中包含員工的一些名稱。關鍵字new創建了一個對象類Employee的實例,其中someData變量引用了新創建的對象。

所以現在someData變量可以說是引用Employee object,因爲它包含存儲對象存儲位置的內存地址。這個地址將允許我們訪問對象的實際數據,在這種情況下是員工的名字。

如果我要創建一個數據類型爲EmployeeArrayList,我可以在其中存儲Employee objects。所以我可以將someData變量添加到arrayList以及someData2someData3等。 (假設他們都是同一類型但包含不同的員工信息)。 因此,每個變量都包含對這些對象的引用。然後ArrayList對象也包含對這些對象的引用,因爲ArrayList元素包含引用Employee Objects的這些someData變量。

例如:

ArrayList.get(1) -> someData -> reference variable(address) -> employee Object 
ArrayList.get(2) -> someData2 -> reference variable(address) -> employee Object2 

敢肯定我上心下來,到目前爲止,但什麼略有拋出我送行是當你實際上沒有創建一個參考變量。

假設你創建一個循環來創建一個對象(數據正在從某個數據庫等中讀取)並將其添加到ArrayList。在此循環中,您收集所需的數據並使用它創建一個對象,然後將其直接添加到ArrayList

比方說,它看起來像這樣(的一些僞代碼和實際代碼組合)

ArrayList<Employee> list = new ArrayList<Employee>(); 
// While data from the database still exist (while loop,etc) 
// extract some sort of data from the database, such as their name and hours 
// create an object of this information and store it in an ArrayList 
list.add(new Employee(name, hours); 
// end loop 

爲了簡單起見,讓我們說,循環跑了5倍,因此創建5個對象。 這意味着它向ArrayList List添加了5個對象,並且這些對象的引用實際上包含在ArrayList元素中。所以要獲得第一個對象添加到ArrayList您可以使用list.get(1)(我很確定ArrayList從1開始,而不是索引0),它返回對該對象的引用。

編輯:請原諒我在這裏的錯誤,我想我有一個brainfart,混淆了。我不知道爲什麼我認爲ArrayList索引像這樣工作了一秒

這是通過使用循環創建對象的正確和標準方法嗎?

+0

答案是「是」,但我不確定你想知道什麼。這個問題非常廣泛。 – 4castle

+0

一切除了_I'm非常確定ArrayList開始於1,而不是索引_ 0是正確的。 _reference variable_是一些引用類型的變量。 「員工」是一種參考類型。所以'員工someData;'是一個參考變量的聲明。 – Savior

+0

*「ArrayList元素包含這些someData變量」*這是我不確定你是否正確的地方。 ArrayList沒有變量,它也有引用。當你調用'theArrayList.add(someData)','someData'的值(它指向的對象的地址)被複制。你最終得到的是兩個單獨的引用(一個在'someData'變量中,一個在'ArrayList'中),它指向同一個對象。 Java引用就像指針一樣。可能會看到http://stackoverflow.com/q/40480/2891664。 – Radiodef

回答

0

我不知道這是否會永遠是有用的,只是有一個行代碼,創建一個新的對象o只要使用new關鍵字,因爲沒有什麼實際上是抱着參考信息。但它似乎是正確的。

想象一下,構造函數啓動一個新的線程。沒有參考,但

new AmazingThread(); 

在這種情況下罰款。

嗯,這個問題很大。是的,創建這樣的對象是完全合法的。你可以想象ArrayList擁有自己的存儲引用的變量。

+0

感謝您的輸入。是啊,現在看來我已經仔細考慮過了,閱讀這裏的評論等。它只是覺得有點不合適,因爲我以前從來沒有真的需要解決這個問題,所以我想澄清一下我的想法。祝你有美好的一天/晚上! – pudge