当然是不变了
因为在传入方法ChangeString的是对象name在内存中的地址
但是当调用s = s + " Changed;后,方法内的s的内存中的地址已经改变了
和方法外的已经不同了,所以不管做了什么操作,都不会影响到对象name
因为在传入方法ChangeString的是对象name在内存中的地址
但是当调用s = s + " Changed;后,方法内的s的内存中的地址已经改变了
和方法外的已经不同了,所以不管做了什么操作,都不会影响到对象name
解决方案 »
- C#转Java,long转int的数据溢出但程序不报错问题 谢谢
- 要達道里面代碼的功能,不用java 2d 有沒有別的思路? 思路就行~
- 问一道java面试题目,下面说的正确吗?为什么这样啊???
- 只能输入4位半角数字的JTextField中输入全角字符时会消去已有的数字。
- 不太会用this关键字!求救
- 如何将这样的字符串,分解为数组?
- 用mina通过VPN传数据时,碰到java.nio.channels.NotYetConnectedException,求思路!!
- RMI客户端怎么连不上服务器啊,好像是什么java.security.AccessControlException
- 求用JBUILDER连接ORACLE的一些实例
- 新手的问题????
- 请推荐几本Java好书
- 各位打内高手,请问java中,我怎样获取一个随机值
是机上的操作是创建了一个新的String对象然后让s指向它。
s = s + " Changed ";
的结果是产生一个新的String,其值为原来s + " Changed "。
在函数里,s是发生改变了,其内存地址并不是原来的位置。
这个改变并没有影响到函数之外,所以,实际参数的内存地址仍然是原来的位置,所以你看到的结果是没有改变。所谓immutable类是只要类的对象产生了,就不会改动,所以,即便其引用变了,其实际内存中的内容还是不会改变的。可以参考一下,《Effective Java》关于immutable类的介绍或《Java与模式》中关于不变模式的讲解。
public String TestString;
}public class TestObjectChange{
public static void main(String arg[]){
ObjectForTest obTest = new ObjectForTest();
TestObjectChange Test = new TestObjectChange();
obTest.TestString = "Test";
System.out.println("The origal string is: " + obTest.TestString);
Test.ChangeObject(obTest);
System.out.println("The string is change by function: "+obTest.TestString);
obTest.TestString = "Test";
System.out.println("The origal string is: " + obTest.TestString);
ObjectForTest obTest2 = obTest;
obTest2.TestString = "Changed by another object";
System.out.println("The string is changed by another object " + obTest.TestString);
}
void ChangeObject(ObjectForTest ob){
ob.TestString = "changed by function";
}
}这是我写的代码证明传地址
在纯java语言里看不到差别。
写过JNI的朋友可能会知道,多个对同一个对象的引用的值是不一样的。所以说这个引用值显然不是该对象的地址。
事实上所有对象的操作都是通过对象的引用来完成的。
而java对象的引用和C++里面的引用是不一样的,C++里面的引用就是传地址。
从付值结果来看,java的引用和传值是一样的。用'='付值后的变量会指向一个新的对象(或null).s = s + " Changed";
这行代码可以理解成(事实上编译器是这样解释的):
StringBuffer temp = new StringBuffer();
temp.append(s);
temp.append(" Changed");
s = temp.toString();此时的s显然不是原来的s了,已经是对另外一个字符串对象的引用。
public int i;
public MyMainTest(){
i = 0;
}
public static void main(String args[]){
MyMainTest myTest = new MyMainTest();
myTest.addI(myTest);
System.out.println(myTest.i);
}
public void addI(MyMainTest argTest) {
argTest.i++;
}
}请高手给我分析一下这段代码