import java.io.*;
class text{
public static void main(String[] args) {
String str="aaaa";
String t;
t="bbbb";
str=t;
System.out.println(str); //此处输出str值为bbbb
changeStr(str);
System.out.println(str); //调用changeStr方法但结果str的值并不是cccc却是bbbb
}
public static void changeStr(String t){
t=new String("cccc");
}
}不是说String是用来处理不可变字符串的吗,那为什么会出现这种情况呢?为什么字符串str创建后值有时变有时不变呢??
这和理论上的“字符串一旦创建,内容就不再改变”不一样啊!
求各路高手出来指点一下~~~
import java.io.*;
class text{
public static void main(String[] args) {
String str="aaaa";
String t;
t="bbbb";
str=t; //此处str指向字符串t的起始内存地址,所以输出的是t的内容
System.out.println(str); //此处输出str值为bbbb
changeStr(str); //调用changeStr()方法并没有改变str引用的指向,所以输出的还是t的内容
System.out.println(str); //调用changeStr方法但结果str的值并不是cccc却是bbbb
}
public static void changeStr(String t){
t=new String("cccc");
}
}
http://topic.csdn.net/t/20051130/22/4429667.html
class text{
public static void main(String[] args) {
String str="aaaa";
String t; //你这里只声明了一个引用,内存没有分配具体空间
t="bbbb"; //这里内存创建空间,并存储值
str=t; //str 放弃原来指向的内存地址 , 从新指向 t 指向的地址 现在str t 指向同一地址
System.out.println(str);
changeStr(str);
System.out.println(str);
}//至于这个方法,由于String是final类型,每次改变的时候都从新创建一个String对象。 所以会出现你的情况。
public static void changeStr(String t){
t=new String("cccc");
}
}
str = "bmn"; 这个str已经不是原来的str了 , 创建了一个新的对象还叫原来的名字str . 所有才会有 StringBuffer 和 StringBuilder 这两个东西存在 ,解决每次字符串改变的效率问题。
class text{
public static void main(String[] args) {
String str="aaaa";
String t;
t="bbbb";
str=t;
System.out.println(str); changeStr(str);
System.out.println(t);
System.out.println(str); }
public static void changeStr(String t){
t=new String("cccc");
System.out.println(t);
}
}你这样再试试应该就该明白了!!!
这个要从虚拟机JVM内部来说吧
new String("AAAbbb");后,在虚拟机保留的有"AAAbbb";
当你解惑字符串变为"AAAb" 如果之前虚拟机中没有 则重新创建
t=new String("cccc");
}java的参数引用是值的传递,不是存储地址的
传递,所以你的方法实际上改变的是参数的变量。
改为:
将 String t改为全局变量。
改为:
class text{
String t = "";
public static void main(String[] args) {
String str="aaaa";
String t;
t="bbbb";
str=t;
System.out.println(str); //此处输出str值为bbbb
changeStr(str);
System.out.println(str); //调用changeStr方法但结果str的值并不是cccc却是bbbb
}
public static void changeStr(String t){
this.t=new String("cccc");
}}
class text{
public static void main(String[] args) {
String str= new String("aaaa");
String t;
t="bbbb";
str=t;
System.out.println(str); //此处输出str值为bbbb
String s=changeStr(str);
System.out.println(s);
System.out.println(t);
System.out.println(str); //调用changeStr方法但结果str的值并不是cccc却是bbbb
}
public static String changeStr(String t){
t=new String("cccc");
System.out.println(t);
String s = t;
return s;
}
}changeStr(String t)是引用传递,在方法里生成了一个同名的t String对象 ,赋值是又重新指向了一个新的地址。
class text{
public static void main(String[] args) {
String str="aaaa"; //从内存分配一个“aaaa”的空间给str
String t; //申明了t的一个引用
t="bbbb"; //内存分配“bbbb”,并指向t的引用
str=t; //把str的引用也指向t,str和t指向同一内存空间
System.out.println(str); //输出str的指向,也是t的指向
changeStr(str); //调用changeStr(str)方法,传递str的引用
System.out.println(str); //输出str的引用指向
}
public static void changeStr(String t){
t=new String("cccc"); //这里从内存里面重新分配了一个空间给t,但str的指向并没有改变,所以打印的结果是“bbbb”,而不是“cccc”
}
}import java.io.*;
class Mine{
public static void main(String[] args) {
String str="aaaa";
String t;
t="bbbb";
str=t;
System.out.println(str);
str=changeStr(str);
System.out.println(str);
}
public static String changeStr(String t){
t=new String("cccc");
return t;
}
}这样就可以了
凶器说的没错,你只改变了changeStr(String t) t的地址。影响不到外面的地址的。
好比下列代码,也是同样的原因。import java.io.*;
class interfaceTest{
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("66666");
changeStr(sb);
System.out.println(sb);//输出666665555
}
public static void changeStr(StringBuffer s){
s.append("5555");//改变传进来的地址上,对应堆的上值。 所以影响到sb
s=new StringBuffer("33333");//改变了地址
s.append("2122");//地址不一样影响不到外面的 sb
}
}
我不写那么多文字和代码,就用两句话:
1)java没有指针,所有没有C语言“通过指针修改入参”的功能:以下是C修改入参的典型应用
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}2)java也没有C++引用传递的功能,所以也无法“通过引用修改入参”:以下是C++的引用修改入参功能
void swap(int &a,int &b)
{
int temp =a;
a = b;
b = temp;
}归根到底,java所有参数都是值传递。关于值传递和引用传递、指针传递的话题,建议各位去学习一下C以及java的高级话题:深入java内存
java 中都是值传递c才会有引用传递
public static void changeStr(String t){
t=new String("cccc");
}
可以试着改一下:
public static String changeStr(String t){
t=new String("cccc");
return t;
}
class text{
public static void main(String[] args) {
String str="aaaa";
String t;
t="bbbb";
str=t;
System.out.println(str); //此处输出str值为bbbb
System.out.println(changeStr(str)); //调用changeStr方法但结果str的值并不是cccc却是bbbb
}
public static String changeStr(String t){
t=new String("cccc");
return t;
}
}这样你就可以得到cccc了 。你的那个函数没有返回这个字符串。所以你打印的是开始这个字符串变量