0

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

例如 -

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
    }
}

a在这种情况下b是 URL。

我这里的代码类似于这个页面。在这种情况下,缓冲的 reader 对象会先有 URLa的数据,然后是b?

4

4 回答 4

1

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

你有一个bufferedReadertype的引用BufferedReader

在第 1 行,您初始化对null. 它不指向一个对象。

在第 4 行,您更改了bufferedReader参考指向的位置。它现在指向一个最终从a.

在第 7 行中,您更改了bufferedReader参考指向的位置。它现在指向一个最终从b.

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

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


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

那更像是:

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

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

于 2013-07-27T04:53:26.490 回答
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);
于 2013-07-27T04:55:45.003 回答
0

好吧,这样想吧——每次调用 new 关键字时,都是在调用它之后的对象类的构造函数。这会在堆上为您创建一个新对象。所以在上面的代码片段中,你已经做了两次,首先你初始化了一个 BufferedReader()链接到流 a 的对象,供你bufferedReader参考。一旦 while 循环完成并且您点击下一个新关键字,您将创建另一个BufferedReader链接到流 b 的对象,现在您的bufferedReader引用句柄指向它。

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

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

于 2013-07-27T04:56:55.290 回答
0

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

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

于 2013-07-27T04:55:53.897 回答