如何解释下面的结果?public class Test { static String s1 = "s1"; public static void main(String[] args) { change(s1); System.out.println(s1); } public static void change(String s) { s = "b"; System.out.println(s); System.out.println(s1); s1 = "a"; System.out.println(s1); }} 结果如下 b s1 a a
这并没有说明问题啊。。如果是用String str="abc";//这种方式创建对象,当参数传递时直接传递 abc 能理解String str=new String("abc");//这种方式用了new关键字,那说明是在堆区中创建了,并且返回了一个引用给str这样的引用不还是一个在堆区中的地址值嘛
public class Test3
{
public static void f(String str)
{
str=str+"1";
}
public static String f1(String str)
{
return str+"1";
}
public static void main(String[] args)
{
String a="abc";
String b=new String("abc");
f(a);
f1(a);
System.out.println(a);
System.out.println(f1(a)); f(b);
f1(b);
System.out.println(b);
System.out.println(f1(b));
}
}
若参数是基本数据类型,如:void swap(int x,int y){..}
若调用的是:sawp(a,b);
//此时,参数参数传递机制的"传值"中的值是实参a,b变量的值.
除此之外(即:参数不是基本数据类型),如:void change(String a){..}
若调用的是:change("xxx");
//此时,参数参数传递机制的"传值"中的值是实参"xxx"这个对象的引用(简单理解就是内存地址).
若参数是基本数据类型,则:参数传递机制中的"传值"中的值是实参的值
否则(参数不是基本数据类型,即参数是对象),
则:参数传递机制的"传值"中的值是实参对象的引用(简单理解就是内存地址).
java世界中全部是对象,但只有通过引用来操作对象。
java中也只有值传递,要么是基本类型的值,要么是对象的引用。
这引用被认为是值,
而这个引用也就相当于对象在内存中的地址。
通过传过来的对象的引用(参数的值),能不能修改对象本身,是与该对象是如何定义的(即:对象本身有没有提供对其自身修改的方法有关),与参数传递本身是没有关系的.
如何解释下面的结果?public class Test
{
static String s1 = "s1"; public static void main(String[] args)
{
change(s1);
System.out.println(s1);
}
public static void change(String s)
{
s = "b";
System.out.println(s);
System.out.println(s1);
s1 = "a";
System.out.println(s1);
}}
结果如下
b
s1
a
a
答:这个结果很正常啊。而且我可以告诉你,void change(String s) 中的形式参数的类型String可以改成任何其它对象类型(不仅仅是String类型)均可以,如:改成Object,运行结果同样会出现你的String的那个本质上是相同的结果。
因而你的这个例子一点也说明不了你的String的特殊性。你的例子的运行结果是如下运行的:第一步:先执行change(s1);
过程是:
1)将实参s1的值(注意:是串"s1"的引用)赋给形参s,(此时s1,s都指同一个串对象"s1"),
2)然后执行:s = "b"; 此时形参s又指向串对象"b",(s不再指向串"s1"了,但实参s1仍指向串"s1"),
3)再执行:System.out.println(s); 将输出b
4)再执行:System.out.println(s1); 将输出 s1
5) 再执行:s1 = "a"; 此时实参s1又指向串"a"了
6) 再执行:System.out.println(s1); 将输出a
第二步:执行:System.out.println(s1); 将输出a
这就是结果。一点也说明不了什么。即:把void change(String s) 中的形式参数的类型String可以改成任何其它对象类型(不仅仅是String类型)均可以,你的这个例子一点也说明不了你的String的特殊性。
这句理解错了 当成int i = 7;
i = 8;
这种赋值了,两者是有区别的。其实就是值类型和引用类型的区别。
没有理解好。