当前位置: 技术问答>java相关
关于String与StringBuffer问题的再次提问----在线等待
来源: 互联网 发布时间:2015-09-08
本文导语: public class test { public static void stringReplace (String text) { text = text.replace ('j' , 'i'); } public static void bufferReplace (StringBuffer text) { text = text.append ("C"); } public static void main (String...
public class test {
public static void stringReplace (String text) {
text = text.replace ('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.append ("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
输出结果javajavaC
请问,为什么String类型的textString不改变哪?
public static void stringReplace (String text) {
text = text.replace ('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.append ("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
输出结果javajavaC
请问,为什么String类型的textString不改变哪?
|
这跟两点有关
一个是关于java的函数到底是传值还是传地址
一个是关于对象的
首先肯定的是:java是传值的,但你的这两个函数是传的两个对象,而对象是没有值 的,所以相当于传的是句柄,对于string对象来说,定义了之后,在内存中的值是不可以再改变的,一旦改变,就会新建一个string对象来容纳新的值,也就是产生了一个新的对象,而对于stringbuffer来说,本身是可以改变的,你执行了那步append的操作之后,那个对象本身的句柄并没有发生改变,所以在函数里面的变化就想当于在外面的操作,而string对象的那步操作,传进去的是一个对象,而 改变之后是另一个对象,那么函数体完成之后,能够 显示 出来的当然只是你开始的对象,改变之后的对象出来后是看不到 的
以上的解释应该满意了吧
一个是关于java的函数到底是传值还是传地址
一个是关于对象的
首先肯定的是:java是传值的,但你的这两个函数是传的两个对象,而对象是没有值 的,所以相当于传的是句柄,对于string对象来说,定义了之后,在内存中的值是不可以再改变的,一旦改变,就会新建一个string对象来容纳新的值,也就是产生了一个新的对象,而对于stringbuffer来说,本身是可以改变的,你执行了那步append的操作之后,那个对象本身的句柄并没有发生改变,所以在函数里面的变化就想当于在外面的操作,而string对象的那步操作,传进去的是一个对象,而 改变之后是另一个对象,那么函数体完成之后,能够 显示 出来的当然只是你开始的对象,改变之后的对象出来后是看不到 的
以上的解释应该满意了吧
|
我想你是不是將C++中的指針和這裡的引用搞弧度了,引用傳遞的是一個值,一個實例的地址值,當被調用的方法接收到這個值時,它可以根據這個地址去引
用這個對象,從而修改這個對象的屬性,調用它的方法,當被調用的方法處理完
之後,不管你在調用這個方法的過程中是否給那個引用重新分配了值,他都不會
把你重新分配的這個值傳遞回去(不同與C++中的指針參數);
用這個對象,從而修改這個對象的屬性,調用它的方法,當被調用的方法處理完
之後,不管你在調用這個方法的過程中是否給那個引用重新分配了值,他都不會
把你重新分配的這個值傳遞回去(不同與C++中的指針參數);