具有相同参考变量的对象

时间:2013-07-27 04:44:56

标签: java

如果两个相同类型的对象具有相同的引用,会发生什么?

例如 -

BufferedReader bufferedReader=null;
try{
    bufferedReader = new BufferedReader(new InputStreamReader(a.openStream())); 
    while ((inputLine = bufferedReader.readLine()) != null) {
        //do something
    }

    bufferedReader = new BufferedReader(new InputStreamReader(b.openStream()));
    while ((inputLine = bufferedReader.readLine()) != null) {
        //do something
    }
}
在这种情况下,

ab是网址。

我在这里的代码类似于this page。在这种情况下,缓冲的阅读器对象首先会获得网址a的数据,以及稍后的b数据吗?

4 个答案:

答案 0 :(得分:1)

我不相信你已经将你的问题表达为你真正想要问的问题。回答你未提出的问题...

您的bufferedReader类型的引用BufferedReader

在第1行,您初始化对null的引用。它没有指向一个对象。

在第4行,您可以更改bufferedReader参考指向的位置。它现在指向一个最终从a获取数据的对象。

您更改bufferedReader引用所指向的第7行。它现在指向一个最终从b获取数据的对象。

  

缓冲的阅读器对象首先会有URL a的数据,后来是b?

的数据

是的,您的代码将从URL a检索数据,然后从URL b。

中检索数据
  

如果两个相同类型的对象具有相同的引用,会发生什么?

那更像是:

Foo o1 = new Foo();
Foo o2 = o1;

现在,o1o2指向同一个对象。在这种情况下,通过任一引用调用方法将影响相同的(单个)对象。

答案 1 :(得分:1)

这与做的相似, 让我解释给出一个简单的例子,你将能够在你的案例中进行映射。

int a = 10;

a = 2 + 3 ;
sysout(a);
// a have 5 right now, next line will change the contents to 9,
   so previous data within a is no longer exist.

a = 4 + 5 ;
sysout(a);

用户定义的类型

class Student{
  private int rollNo;
 //getter-setter
}

Student s = new Student();
s.setRollNo(10);

sysout(s.getRollNo);

现在,在同一个参考文献中,您正在为新学生创建对象,然后对前一个学生的引用将丢失,您的引用将开始指向新的学生对象。

s = new Student();
s.setRollNo(20);

sysout(s.getRollNo);

答案 2 :(得分:0)

同一个变量(bufferedReader)引用第一个“new”之后的一个对象,然后将它重新分配给第二个“new”的第二个不同对象。

值得注意的是,Java垃圾收集器将释放未使用的对象......但它不会关闭仍然打开的文件。第二个“新”引入了资源泄漏;)

答案 3 :(得分:0)

好好想一想 - 每次调用new关键字时,都要调用对象类的构造函数。这会在堆上为您创建一个新对象。因此,在上面的代码段中,您已经完成了两次,首先初始化一个BufferedReader()对象链接到流式传输,用于bufferedReader引用。 while循环完成并点击下一个新关键字后,您将创建另一个链接到流b的BufferedReader对象,现在您的bufferedReader引用句柄指向该对象。

Java具有自动垃圾收集功能,一个引用一次只能指向堆上的一个对象(即使Array被认为是自己的对象)。因此,一旦您将引用从链接到a的BufferedReader对象切换到链接到b的对象,前者就会被垃圾回收。

请记住,左侧是声明,例如:     Object obj1; 右侧是调用以创建所提供类型的新对象,例如:     obj1 = new Object(); 中间的等于使您的obj1引用指向堆上新创建的对象。希望有所帮助。