不好意思有一条代码贴错了!//调用函数改变String的值
stringTest1.ChangeStr(stringTest1);
应该是:
//调用函数改变String的值
stringTest1.ChangeStr(stringTest1.strTemp);
恳请各位不吝赐教!
stringTest1.ChangeStr(stringTest1);
应该是:
//调用函数改变String的值
stringTest1.ChangeStr(stringTest1.strTemp);
恳请各位不吝赐教!
str = "help me!";
改为:
strTemp = "help me!";
这样就OK了!!!
{
str = "help me!";
}
一般的str在此只是个形参,都是用来把本身的值赋给类里面其他的成员的,比如如果你已经事先给str="help me!"了,那么在此:public void ChangeStr(String str)
{
strTemp = str;
}
就可以了
stringTest1.ChangeStr(stringTest1.strTemp);
传递的只不过是一个字符串,并不是什么对象!!!
public void ChangeStr(String str)
{
str = "help me!";
}以下是其逻辑书写(相当于传统的C语言写法,只是在java里定义方法时简化了代码的书写格式):
public void ChangeStr();
String str;//你调用这个函数时,会运行隐藏了的一句:str=stringTest1.strTemp
{
str="help me!";
}看明白了吗?这个str就是ChangeStr函数里实际存在的变量,并不等同于函数所引用的对象。 str=stringTest1.strTemp;
str="help me!";
上面这两条语句运行后,就会得出下以结果吗?
stringTest1.strTemp="help me!"
答案是绝对不会,上面那两条语句只不过是给同一个对象赋了两次值而已。
另:
java中除String之外,其它对象在被引用时,如果进行了修改
比如:xxxx.remove("……");
这种修改会作用于被引用对象本身,而String被引用时,是在函数里产生一个本地副本,所有对它的修改,都只作用于这个副本,其实String对象也没有修改自身的方法。 与String相比之下,StringBuffer显得很特殊,StringBuffer对象被引用时,象普通对象一样,举例如下:StringBuffer sb=new StringBuffer();
//假设有一个ChangeStringBuffer(StringBuffer strb)函数
ChangeStringBuffer(sb);
//运行这句之时,如果对strb参量被修改(比如:sb.append("help");),会直接作用到sb对象
我就说几下吧
见过贴的人都知道他在到弄string 变量
他可一新加一个对象。那种编程就是我交作业用的
但在这不行
我就想在函数里改
public void ChangeStr(String str)
{
str = "Has changed!:)";
} public static void main(String[] args) {
StringTest stringTest1 = new StringTest(); String str1 = "Befored changed!";
System.out.println(str1);
//调用函数改变String的值
stringTest1.ChangeStr(str1); System.out.println(str1);
}
}你的测试方法本身是错的,对于java来说出了6种基础数据类型外,其余的都是对象
对于对象其实也可以传值的,在c++中就可以,不过c++提供最终也提供了予以支持的
引用传递,而改用const &来保证对想在函数中部被改变。java对于本地的方法调用
对象都是传引用的:),如上例。远程方法例外:)
你说得我明白!在C++中是可以那么理解的!但是java中我却理解不了!
你可以用下面这条语句分别查看一下strTemp,和ChangeStr中的str对象指向的位置:System.out.println(strTemp.CASE_INSENSITIVE_ORDER);public void ChangeStr(String str)
{
str = "help me!"; System.out.println(str.CASE_INSENSITIVE_ORDER);
}打印的结果表明两个变量指向的同一个对象???为什么??
真是郁闷呀!
谢谢!
特此贴出大分贴!希望各位给予充分的解答!
不知你是想说明什么?可否在来说说!谢谢!
数组的问题怎么解释呢!如果把程序中的String都换成数组!
你也会得到同样的结论!两次输出结果是一样的!
它是不可修改的
无论你如何修改之
结果都是生成一个新的String
如果你需要有一个可以修改的String
建议采用StringBuffer
首先“Hello world"在JVM中是有固定的地址的,不会变化。所以你用
String strTemp = "Hello World!"; 是表示strTemp指向”hello World"的地址 其后你调用方法,使方法ChangeStr()中的local 变量str指向了stringTest1.strTemp
stringTest1.ChangeStr(stringTest1.strTemp);
这是str = stringTest1.strTemp
在ChangeStr() 中,调用
str = "help me!";
是改变str的引用指针位置到“help me”对象,和stringTest.strTemp没有任何关系
所以你如果输出str 肯定是help me
但是strTemp还是“Hello World" 我讲的不是很清楚,不过你可以去看看SCJP里面关于Local Variable的教程,就是讨论这个的!!看了以后就会明白了。
你不妨试试用String定义一个类的成员变量!然后通过实例化类的对象来改变String就能得到理想的效果!
code:
public class ReferenceTest {
private String strTemp = "Hello world!"; public void ChangeStr(ReferenceTest temp)
{ temp.strTemp = "Help me!";
} public ReferenceTest() {
}
public static void main(String[] args) {
ReferenceTest referenceTest1 = new ReferenceTest(); System.out.println(referenceTest1.strTemp);
referenceTest1.ChangeStr(referenceTest1);
System.out.println(referenceTest1.strTemp);
}
}
输出结果:
Hello world!
Help me!改变了!你能否解释解释这是为什么?
他和你的观点是相悖的!你能不能给我解开呀!
还有你说的《SCJP里面关于Local Variable的教程》在哪里?
谢谢你!
java核心技术 卷一 原理 上也就是这么说的。
比如字符串“hello”永远是字符序列“h”“e”“l”“l”“o”。这些值不能改变的。
你的程序中修改字符串用的是temp.strTemp = "Help me!"; 明确了是把temp.strTemp的指向改变了
而你原来是用的 str = "help me!"; 修改的是方法内变量str
所以这时你要是修改strTemp 那么
《SCJP里面关于Local Variable的教程》是不存在的,是《SCJP认证指南》的一章
不过!我不明白的是:peacock_king(孔雀王) :
你说得我明白!在C++中是可以那么理解的!但是java中我却理解不了!
你可以用下面这条语句分别查看一下strTemp,和ChangeStr中的str对象指向的位置:System.out.println(strTemp.CASE_INSENSITIVE_ORDER);public void ChangeStr(String str)
{
str = "help me!"; System.out.println(str.CASE_INSENSITIVE_ORDER);
}打印的结果表明两个变量指向的同一个对象???为什么??
真是郁闷呀!
谢谢!
特此贴出大分贴!希望各位给予充分的解答!
http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=3156&message=7486&redirect=true&hilite=true&q=%B4%AB%B5%DD
但愿你看完不会晕..反正我是晕了..
String strTemp = "Hello World!";
这时JVM申请内存空间,不妨认为地址是0x1000,从这个地址开始存放"Hello World!",然后strTemp中存放0x1000这个地址。
传参时public void ChangeStr(String str)
这时隐式执行str=strTemp;只会使str中也存放0x1000
当你执行str = "help me!";时
JVM申请内存空间,不妨认为地址是0x2000,从这个地址开始存放"help me!",然后str中存0x2000这个地址。显然strTemp没有受到影响。
总算弄明白了一点
在java的函数调用中队说有的对象实际上是传递句柄的一个副本
public void ChangeStr(String str)
{
str = "help me!";
}
这个函数调用实际上等于这样的一段代码:
tempStr = str;
tempStr = "Help me!";
然而如果是数组的话就不会有这个问题了:
class ChangeClass{
int t=0;
public void change(int c){
t = c;
}
public int getT(){return t;};
}public class StringText {
public void ChangeStr(String[] str)
{
str[0] = "Has changed!:)";
}
public void changeClass(ChangeClass cs){
cs.change(1234);
} public static void main(String[] args) {
StringText stringText1 = new StringText(); String str1[] = new String[]{"Befored changed!"};
String str2 = str1;
System.out.println(str1[0]);
//调用函数改变String的值
stringText1.ChangeStr(str1);
System.out.println(str1[0]);
ChangeClass cs = new ChangeClass();
System.out.println(cs.getT());
stringText1.changeClass(cs);
System.out.println(cs.getT());
}
}
这次测试过了,数组的第一个元素确实被改变了,对象同样也跟着改变了
而String类的对象是“不可改变”对象,没有办法改变其值
因为它没有自改变的方法如ChangeClass的change方法http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=706
http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=3156&message=7486&redirect=true&hilite=true&q=%B4%AB%B5%DD
中有下面一段:
当执行返回到 main 时,再次打印出这三个参数的值。正如预期的那样,整型的 val 没有改变。对象引用 sb1 也没有改变。如果 sb1 是按引用传递的,正如许多人声称的那样,它将为 null。但是,因为 Java 编程语言按值传递所有参数,所以是将 sb1 的引用的一个副本传递给了 modify 方法。当 modify 方法在 //1 位置将 r1 设置为 null 时,它只是对 sb1 的引用的一个副本进行了该操作,而不是像 C++ 中那样对原始值进行操作。就是说java中所有的对象实际上不是按引用传递的!而是传递的一个引用的副本!