专业的JAVA编程教程与资源

网站首页 > java教程 正文

如何理解 Java的值传递和引用传递

temp10 2025-06-13 16:51:23 java教程 1 ℃ 0 评论

Java数据类型中,分为基本数据类型引用数据类型

常见的引用数据类型就是类和数组了。

如何理解 Java的值传递和引用传递

eg:

class HaC {
    String name;
    
    public static void main(String[] args) {
        int age = 25;
        String[] interests = {"打代码"};
        int[] scores ={100};
        HaC haC = new HaC();
        haC.name = "HaC";

        System.out.println("我的名字:" + haC.name + ",年龄:" + age +
 ",我的兴趣之一:" + interests[0] + ",分数:" + scores[0]);

        changeName(haC);
        changeAge(age);
        changeInterests(interests);
        changeScores(scores);
        System.out.println("-----修改后------");

        System.out.println("我的名字:" + haC.name + ",年龄:" + age + 
",我的兴趣之一:" + interests[0] + ",分数:" + scores[0]);

    }

    static void changeName(HaC haC) {
        haC.name = "哈C";
    }

    static void changeAge(int age) {
        age = 18;
    }

    static void changeInterests(String interests[]) {
        interests[0] = "开车";
    }

    static void changeScores(int scores[]) {
        int[] newScores ={60};
        scores = newScores;
    }
}

输出:

我的名字:HaC,年龄:25,我的兴趣之一:打代码,分数:100
-----修改后------
我的名字:哈C,年龄:25,我的兴趣之一:开车,分数:100

可以看到有两处修改成功了:

haC.name = "哈C";
interests[0] = "开车";

agescores[] 没有修改成功。

图解:

1、 changeName 、changeInterests 的原理是一样的

1)第一步

HaC haC = new HaC();
haC.name = "HaC";

haC 是一个引用地址0x9527 ,指向 new HaC() 对象

2)第二步

调用方法

changeName(haC);
static void changeName(HaC haC) {
       
}

HaC haC = new HaC();changeName(HaC haC)参数里面的两个haC 地址都是一样的,指向同一个对象。

3)第三步

修改

haC.name = "哈C";

所以这个修改是通过地址去修改了值。

2、changeAge、changeScores 原理差不多

changeAge的过程:

int age = 25;
changeAge(age);

age的值copy 了一份给changeAge方法

修改了进行修改(但是这个修改是修改副本的值)

age = 18;

changeScores 的过程:

1)第一步

初始化

 int[] scores ={100};

scores指向一个地址0x1314

2、第二步

调用方法

changeScores(scores);
static void changeScores(int scores[]) {
    
}

scores的地址传递给副本(方法),两个同样指向地址0x1314

3、第三步

changeScores方法重新把一个新值(地址)赋予给scores

int[] newScores ={60};
scores = newScores;

此时两个地址是不一样的,但是方法里面的局部变量scores全局变量 scores 所指向的是不一样的,你是你,我是我。


在Java中,大家都觉得参数的传递分为 值传递引用传递

如果参数是基本类型,传递的是基本类型的字面量值的拷贝。

如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

但是Java中方法参数传递方式是按值传递也只有值传递(地址也是值啊!)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表