public class Demo1 {
        static int a = 1;
    public static void main(String[] args) {
        System.out.println(a);
        chang(a);
        System.out.println(a);
    }

    static void chang(int a) {
        a = 10;
    }

}

输出的是什么?

我一开始没留意,直接就被坑了(正确答案是两个1),细节决定成败呀。

基本类型的试过了,那再试试引用类型的。

public class Demo2 {

    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.o);
        chang(a);
        System.out.println(a.o);
    }

    static void chang(A a) {
        a.o = "hi";
    }

}

class A{
    String o = "hello";
}

输出了什么?正确答案:hello hi

搞到这里,问题来了,方法的传参传的是什么?方法的传参的运行机制是什么?

我想了好久,才想明白,

我的理解是Demo1的第9行这个 chang(int a) 的意思是方法chang里新定义一个int型的局部变量a,并且把方法调用时传进来的参数拷贝赋值给a。所以这里的 a=10 是给局部变量赋值 并不是类里面的a。其实这个机制我是有意识到的,但从没有仔细去想过这个方法的运行会是怎么样的,一直理所当然,才导致一开始判断失误。

想到这里,就可以浅尝的解释一下方法的重载了,调用方法传参时,会根据传进来的参数与方法 () 内新建的局部变量进行参数类型匹配。

那么Demo2中的引用类型传参也就不难理解了,传进去的就是对象的引用的拷贝。所以Demo2第10行chang(A a)的意思就是新建一个A类的引用a,然后把传进来的引用赋值给a。相当于

A a;
a = 传进来的引用;

基本数据类型和引用数据类型都试过了,那么改成经常被忽略的引用数据类型String变量会是怎么的结果呢?(盲猜会有人以为String类型是基本数据类型)

public class Demo3{
    static String a= "hello";

    public static void main(String[] args) {
        System.out.println(a);
        chang(a);
        System.out.println(a);
    }

    static void chang(String a) {
        a="hi";
    }

}

输出结果是两个 hello。

身为引用类型的String变量为什么会和基本类型变量一样了?不是说引用类型传进去的是一个引用吗?方法根据引用为什么没有改变变量的值呢?

最后修改:2022 年 03 月 21 日
如果觉得我的文章对你有用,请随意赞赏