class C{
public static void main(String args[])
{
String str="hello";
change(str);
System.out.println(str);
}
static String change(String str)
{
return str="helloaa";
}
}
为什么输出的是hello??哪位大虾帮帮忙了
public static void main(String args[])
{
String str="hello";
change(str);
System.out.println(str);
}
static String change(String str)
{
return str="helloaa";
}
}
为什么输出的是hello??哪位大虾帮帮忙了
解决方案 »
- 如何通过反射,将一个字符串,转换为一个类?
- java代码编译报错,请高手帮哈忙
- hibernate+spring 中的查询语句
- 关于代理服务器java.net.SocketException: Unrecognized Windows Sockets error: 10107:
- 各位java爱好者,,请问你们心目中崇拜的人是谁啊??
- IBM VisualAge for Java的功能是什么?
- 准备回家过年,散分
- 怎么用Java程序向邮件服务器中添加、删除用户?
- 在此学得不少东西,散分给有缘人,晚上结贴
- 我期待大家给我指盏明灯谢谢!
- jTextFieldHUO获得焦点的问题
- 100分!各位大哥帮忙啊!老师让我们做一个“计算器”?怎么做了?谢谢!
class C {
public static void main(String args[]) {
String str = "hello";
str = change(str); //改了这一行
System.out.println(str);
} static String change(String str) {
return str = "helloaa";
}
}
static String change(String str) {
return str = "helloaa";
}
中的str是一个局部变量,只在这个方法中有效,出了这个方法就无效了
而且你的这个str变量实际上是对前面定义的那个全局变量的一个拷贝,而不是一个引用,它的改变是不会影响到全局的那个Str
普通的类,传过去,修改了,原来的也会跟着改的!String不行,只能向1楼那样,把新变化的对象返回来,赋值给以前的变量
{
return str="helloaa";
}
这个str的作用域只是这个方法本身。change中的str和main中的str不是一块内存。
public static void main(String... args) {
TT tt = new TT();
tt.str = "hellp";
change(tt);
System.out.println(tt.str);
} static TT change(TT tt) {
tt.str = "helloaa";
return tt;
}
}class TT {
public String str;
}
不同于StringBuffer 虽然也是传值调用 但它的值本身是一个引用
同一个引用指向的是同一个对象
class Test {
public static void main(String args[]) {
StringBuffer str = new StringBuffer("hello");
change(str);
System.out.println(str);
} static StringBuffer change(StringBuffer str) {
return str.append("oaa");
}
}/*
hellooaa
*/
这样说比楼上面的朋友清楚多了。至少一个小问题不会东拉西拉,拉了又牛头不对马口。
别犹豫了,给分!
楼上说的String声明为final ????你回去多看点书,不要误导他人啊!!!
public static void main(String args[])
{
String str="hello";
change(str);
System.out.println(str);
}
static String change(String str)
{
11StringBuffer str;
str="helloaa";
str.append(str);
return str.toString();
}
}
楼上有人说String 声明为final 了吗?别说你把不可变类当做final了吧,String的确是不可变类啊.回楼主:
Java中关于方法的参数传递
基本数据类型,String类和包装类,传递的是值.
类对象传递的才是引用.如果你把String改为StringBuffer结果就不一样了.
final声名一个变量,则这个变量的内容不能改变,然而如下:
String s=new String("爷们你们好");
s值是一个地址值对把,
然而我们可以改变s的值,比如在:
String s=new String("爷们你们好");
s=new String("娘们你们好");
很可以的看见,s的值改变了,然而,与---final声名一个变量,脾并且不能改变值相互矛盾!
所以,很明显!不是声明为final!!
而上面上面的"爷们你们好"这个是一个字符常量,常量,顾名思义,不能改变!
StringBuffer,就不说拉,API...:)
6楼老紫竹的输出是什么
helloaa 吗
觉得说的很清楚:string是引用类型,但它也有一些值类型的特征。 String传值还是传引用
C#的String声明是class String,当然是传引用。
不过,之所以有这个疑惑,多数是因为这个情况:
string a = "aaa";
string b = a;
b = "bbb";
或者是这么几行代码:
public void Swap(string s1, string s2)
{
string temp=s1;
s1=s2;
s2=temp;
}
这时候结果一打印,结果发现a的值还没有变,Swap也没有成功,这时候就会有幻觉:是不是没有传引用啊?
呵呵,string不会这么粗暴的打乱“声明为class就是传引用”这种规则的。
分析一下:
string a = "aaa"; //==> a----->new String("aaa")
string b = a; //==> b----->a, 传引用
b = "bbb"; //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。 Swap函数也是这样,比如说传了a, b进去(a="aaa", b="bbb"),
//s1----->a, s2----->b
string temp=s1;//temp----->s1----->a
s1=s2; //s1----->s2----->b;
s2=temp; //s2----->temp----->a
结果是,s1和s2确实是Swap了,但是这种结果并不会影响到a和b