package Quote;
public class VariableZion{
public static void changeStr(int str[]){
str[0] = 4;
for(int i =0; i<str.length ; i++){
System.out.print(str[i]+" ");
}
}
public static void changeStr(int str){
str = 2;
System.out.println(str);
}
public static void changeStr(String str){
str = "name";
System.out.println(str);
}
public static void main(String[] args) {
int s = 1;// 内存栈空间里,有一个变量s,值为1
changeStr(s);//调用方法 在栈空间里 有一个变量形参str,值为直接传递进去的值,也就是1,之后执行方法str值变成2,打印,然后方法调用完成str消失
//局部变量只在自己的作用域中有效,也就是说,在static方法中str=2只是在他的方法中有效,但是在方法体外面是无效的.
System.out.println(s);
//这里打印1, 如果变量名 s换成str 是一样的
String str2 = "love";
changeStr(str2);
System.out.println(str2);
int chen[]= {1,2,3};
changeStr(chen);//调用方法 在栈空间里 有一个变量形参str,也指向chen指向的数组里的内容,之后执行方法str[0]值变成4,打印,然后方法调用完成str消失
for(int i=0 ;i<chen.length ; i++){
System.out.print(chen[i]+" ");
}
}
}
/*这里需要解释一下,java基本类型(byte、int、char、long、float、double、boolean和short)是传值,也就是传的是副本,
* 而其余传的是引用(所谓引用传递就是把对象的引用地址传进函数,而不是像值传递那样产生一个副本),
* 对于字符串对象来说,虽然在参数传递的时候也是引用传递,
* 但是java虚拟机在函数内部对字符串对象进行了特殊处理--视String对象为常量(final)
* 所以对传进来的引用地址所引用的string对象不能直接进行修改,而是产生一个副本对其进行操作,对其进行的操作不会影响原来的值。
* 这就是为什么字符串和数组都是引用传递,字符串没变而数组变了的原因*/