程序运行问题,基础知识

public class Test {
    Integer integer = new Integer(2);
    char[]ch={'a','b','c'};
    public static void main(String[] agrs) {
        Test ex=new Test();
        ex.change(ex.integer,ex.ch);
        System.out.print(ex.integer+" and ");
        System.out.print(ex.ch);
    }

    public void change(Integer str,char ch[]){
        str = 1;ch[0]='g';
        System.out.println(str);
    }
}
1
2 and gbc

代码跟运行结果如上,问为什么Integer不会改变 char会改变?

Interger你传入的是一个对象,在函数调用的时候这个会自动在程序堆栈中生成这个对象的副本,在函数里改变的是那个在堆栈中的副本,而char你传入的是一个指针,在函数中你是直接对指针指向的位置的进行赋值,因此该位置的值就被改变了

Integer前100多个都是用内存地址的相当于int,并不是引用

Integer被change里的局部变量赋值后输出,即函数内局部变量会覆盖类同名变量,char是数组,函数参数传的是数组地址,改变的也是全局的值

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

char[]是数组并不是char了,数组都是指针保存的,引用类型,不是值类型,所以出来会变,int是值类型,所以不会变

这里有两个专有名词:值传递和引用传递。integer是值传递,char是引用传递,具体的你可以百度一下值传递和引用传递。
值传递
public void change(Integer str,char ch[]){ //这里相当于又重新生成了另一个局部变量str对象,而该局部变量str的值是全局变量integer的值,
//在这个方法中所有对str的操作,都不会改变全局变量integer。这个str在change方法运行完时,gc会自动清除该变量
str = 1; //这里给str重新赋值,而全局变量integer的值不变 ch[0]='g';
System.out.println(str); //这里打印,打印的是局部变量str的值,
System.out.println(integer); //如果你在这里打印integer 那么打印的是全局变量integer的值
System.out.println(ch); //这里打印的是局部变量ch的值
System.out.println(this.ch); //这里打印的全局变量ch的值 此时全局变量ch是和局部变量ch是相等的
}
引用传递
改变的是引用的地址,如在运行了ch[0]='g'后, 此时是全局变量 ch的引用地址改变了
虽然你已经采纳了,但没看到有人给你说这两个概念,我还是告诉你吧。

你可以运行一下以下的代码 :
public void change(Integer integer,char ch[]){
integer = 1;ch[0]='g';
System.out.println(integer);
System.out.println(this.integer);
System.out.println(ch);
System.out.println(this.ch);
System.out.println("*****************");
}

基本数据类型传递的是值,调用change方法后,str对应的hash地址不变,所以值保持不变
引用数据类型传递的是地址,调用change方法后,char数组的hash地址发生改变,值自然就变了