如果两个相同类型的对象具有相同的引用,会发生什么?
例如 -
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
是网址。
我在这里的代码类似于this page。在这种情况下,缓冲的阅读器对象首先会获得网址a
的数据,以及稍后的b
数据吗?
答案 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;
现在,o1
和o2
指向同一个对象。在这种情况下,通过任一引用调用方法将影响相同的(单个)对象。
答案 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引用指向堆上新创建的对象。希望有所帮助。