Java是值传递还是引用传递

发布于:2025-03-08 ⋅ 阅读:(101) ⋅ 点赞:(0)

在Java编程语言中,方法参数的传递总是按值传递的,这意味着不管一个变量是基本数据类型还是引用数据类型,传递的都是一个副本。

对于基本数据类型(如int、float等),这个副本就是数据值本身。因此,当你在方法内部改变这个值时,原始的变量不会受到影响。

对于引用数据类型(如对象),传递的是引用的副本,这个副本和原始引用指向同一个对象。因此,如果在方法内部改变了引用指向对象的状态(即改变了对象的字段),那么原始引用所指向的对象也会被改变。但如果你在方法内部改变了引用本身,使其指向一个新的对象,那么原始引用仍然指向方法外部的原始对象。

以下是一个简单的例子来说明这一点:

public class Test {
    public static void main(String[] args) {
        int num = 10;
        StringBuilder strBuilder = new StringBuilder("Hello");

        // 传递基本数据类型
        changePrimitive(num);
        System.out.println(num); // 输出10,num的值没有改变

        // 传递引用数据类型
        changeReference(strBuilder);
        System.out.println(strBuilder.toString()); // 输出Hello World,strBuilder的内容改变了

        // 再次传递引用数据类型
        changeReferenceItself(strBuilder);
        System.out.println(strBuilder.toString()); // 输出Hello World,strBuilder的内容没有改变
    }

    public static void changePrimitive(int num) {
        num = 20;
    }

    public static void changeReference(StringBuilder strBuilder) {
        strBuilder.append(" World");
    }

    public static void changeReferenceItself(StringBuilder strBuilder) {
        strBuilder = new StringBuilder("New Object");
    }
}

在这个例子中,changePrimitive 方法尝试改变基本数据类型的值,但原始的 num 变量不受影响。而 changeReference 方法改变了 strBuilder 引用指向对象的内容,所以原始的 strBuilder 也反映了这一变化。最后,changeReferenceItself 方法实际上改变了方法内部引用副本的指向,但原始的 strBuilder 引用仍然指向原来的对象,因此原始对象的内容没有改变。


网站公告

今日签到

点亮在社区的每一天
去签到