这个关于java值传递的demo
这个关于java值传递的demo
今天遇到一个问题,给大家分享下,也是自己一直困惑的一个点
Java的值传递
class E{
String str = new String("good");
char[] ch = {'a', 'b', 'c'};
public static void main(String[] args) {
E e = new E();
e.change(e.str, e.ch);
System.out.println(e.str );
System.out.println(e.ch);
}
public void change(String str, char[] ch){
str = "test ok";
ch[0] = 'g';
}
}
System.out.println("我认为是 test ok 和 g b c");
一开始的想法
// String 是包装类,是引用传递, e的str被修改,并不会影响其值
// char作为基本类型, 一定会被修改,因为一直指向其本地
- 值传递:在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
- 引用传递:在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
改正:
String 类型的传递是引用传递,也即是地址传递。
因为在Java里,String是对象类型,作为参数肯定是引用传递。
之所以有值传递的效果,是因为Stirng内部实现时,是用char[] 来存储字符串的,所以String相当于char[]的包装类,那java中,包装类的一个特质就是值操作时体现对应的基本类型的特质。
当写一个函数传递数组时,不要直接对内部成员赋值,否则结果就不可控了, 比如下面这个函数,如果myArray被某个成员函数改变了,那么传递的这个数组也会改变。
基本类型Demo
public void changeInt(int a){
System.out.println("change" + a);
a = 3;
}
public static void main(String[] args) {
E e = new E();
int a = 1;
e.changeInt(a);
System.out.println("Main" + a);
}
同一个地址
这里就是值传递,不会影响到原来的实际参数
public void changeInt(int[] a){
System.out.println("change path" + a);
System.out.println("change" + Arrays.toString(a));
a[0] = 3;
}
public static void main(String[] args) {
E e = new E();
int[] a = {1,1,1};
e.changeInt(a);
System.out.println("change path" + a);
System.out.println("Main " + Arrays.toString(a));
}
同一个地址
包装类型Demo
public void changeInt(Integer a){
System.out.println("change" + a);
a = 3;
}
public static void main(String[] args) {
E e = new E();
int a = 1;
e.changeInt(a);
System.out.println("Main" + a);
}
public void changeInt(Integer[] a){
System.out.println("change path" + a);
System.out.println("change" + Arrays.toString(a));
a[0] = 3;
}
public static void main(String[] args) {
E e = new E();
Integer[] a = {1,1,1};
e.changeInt(a);
System.out.println("change path" + a);
System.out.println("Main " + Arrays.toString(a));
}