1, 值传递和引用传递在java中是传递的引用,在传递参数到方法的时候,都会拷贝一个引用的副本,在方法内部,如果在方法内部改变是副本的内存指向, 那原来的变量是不会发生改变的,如果改变的是指向地址的值,那原对象就会发生改变。
public class StringTest {
public static void main(String[] args) {
String str = "java";
nochange(str, str);
change(str, str);
}
public static void nochange(String str1,String str2) {
System.out.println("nochange--->>"+(str1 == str2));
}
public static void change(String str1,String str2) {
str1 = str1 + "";
System.out.println("change--->>"+(str1 == str2));
}
}
结果:
nochange--->>true
change--->>false
网上引用:
很多人说,java中的String虽然是对象,但是具有值类型的特征。他是值传递,传递的值。
我认为这这种说法完全是错误的。
String和普通对象毫无区别,和其他对象一样,传递的是引用,而不是值。
一段String的运用代码:
String a = "123";
public void change(String a){
a = "234";
}
很多人会说,a的值没有变,是因为String是值传递,问题是,就算对于一个普通对象,这样的用法,该对象的值也是不会改变的!这是一个大大的误区。java中根本没有真正的引用传递,不想C#中有ref关键字!
比如:
Person p = new Person("张三");
public void change(Person p){
p = new Person("李四");
}
上面对于String的使用和这个自定义Person类的使用上,根本没有本质上的区别。同样,外面的p变量依然是”张三”,不会是“李四。”
同样的代码,放入C#中,加上ref关键字:
Person p = new Person("张三");
public void Change(ref Person p){
p = new Person("李四");
}
结果是,p变为了“张三”!
所以说,个人认为java中的String并没有什么特殊性,和其他类一样,同样保存的对象的引用,传递的引用。唯一的特殊性,就是可以直接用“”双引号的方式创建字符串对象。
2, android中多线程, 多进程之间的通信?