帮我看看这个java程序,我不太明白

来源:百度知道 编辑:UC知道 时间:2024/06/04 20:00:23
public class HashCodeTest {
public static void main(String[] args)
{
String ob1=new String("abc");
String ob2=ob1;
String ob3=new String();
ob3=ob1;
System.out.println(ob2);
ob1="kkk";
System.out.println(ob2);
System.out.println(ob3);
}

----------------------
1.
String ob2=ob1;和
String ob3=new String();ob3=ob1;有什么区别?

2.
为何输出的结果是3个abc?ob1不是已经改为kkk了么,为何ob2和ob3不会一起相应的发生改变?

String ob1;String ob2;String ob3这样声明的都仅仅是个引用而已,他们并不在内存中自己的存储地址,就像C里面的指针一样。
new Sting("abc");new String();"kkk"都是实际上在内存中划分出来的地址,他们是实际存在于内存中的,如果没有任何引用指向该地址,java虚拟机会在某个时候把它当做垃圾自动回收的。
在回头看你的程序,ob1=new String("abc");ob2=ob1;ob3=new String();ob1="kkk";
这里都是把引用指向地址,实际system.out.print打印的是地址中的值,跟引用本身无关系,所以把ob1指向"KKK"实际并不影响ob2指向new String("abc"),所以打印的仍然是abc

1.
String ob2=ob1;和
String ob3=new String();ob3=ob1;有什么区别?
=============================
一样的,上面那句其实在JVM里面也是执行了下面的代码.

2.
为何输出的结果是3个abc?ob1不是已经改为kkk了么,为何ob2和ob3不会一起相应的发生改变?

ob2和ob3都是指向了之前ob1中的"abc",它们和ob1没有什么联系
所以改变了ob1的指向,并不会改变ob2和ob3 的指向

先来回来你第一个问题..
你要先知道String是引用类型的,而不是常规的数据类型。
String ob2=ob1;这个是把ob1的对象引用赋值给ob2。此时ob2引用所指向的值就为"abc";
String ob3=new String();是先在内存中构造出一个字符串引用,引用是在栈中的,指向了在堆中的一个位置,这个位置里面的值是 什么也没有的。然后又把ob1的引用赋值给了ob3。此时ob3的值也为"abc";
第二个问题。