当然是不变了
因为在传入方法ChangeString的是对象name在内存中的地址
但是当调用s = s + " Changed;后,方法内的s的内存中的地址已经改变了
和方法外的已经不同了,所以不管做了什么操作,都不会影响到对象name
因为在传入方法ChangeString的是对象name在内存中的地址
但是当调用s = s + " Changed;后,方法内的s的内存中的地址已经改变了
和方法外的已经不同了,所以不管做了什么操作,都不会影响到对象name
解决方案 »
- 急~在线等,label上图片移动问题
- 由“有点难度,算法问题........”这个帖子想到的另一个问题,请大家进来看一看,想一想。
- 100分随便求购一个程序!!(满足条件就给分)
- OutOfMemory,How to
- 反转字符窜为什么无效?
- 用JBuilder9的注册机生成的注册码,还必须联机进行注册吗?为什么我连机注册软件就停在那里了?
- 关于org的poi包的简单问题!!!希望大家帮助!!
- 极度痛苦,人情冷暖,世态炎凉呀。
- about appletviewer
- LDAPException(resultCode=object class violation求大神解决
- 请推荐几本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++;
}
}请高手给我分析一下这段代码