2016-04-15 77 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