欢迎访问宙启技术站
智能推送

Java函数中的传值和传引用区别是什么?

发布时间:2023-06-15 17:12:20

Java函数中的传值和传引用是非常重要的概念。在函数调用过程中,参数传递的方式,既可以是传值,也可以是传引用。其中传值是指将实参的值复制一份给形参,而传引用是指将实参的地址,即引用,传递给形参进行操作。这两种传递方式有着不同的特点和用途,在进行函数设计和编程时需要根据具体情况来选择。

传值

在Java函数中,引用传递的概念并不存在,Java只有传值的概念。传值是指将实参的值复制一份给形参,这样函数在运行时就可以对形参进行操作,而不会影响实参的值。

对于基本数据类型(如int、double、boolean等)的参数,函数中的操作不会改变实参的值,因为它们在传递时是按值传递的。例如:

public class Test {
    public static void main(String[] args) {
        int a = 10;
        increment(a);
        System.out.println(a);
    }
 
    public static void increment(int x) {
        x++;
    }
}

上述程序中,increment()函数执行x++操作增加了形参的值,但是并没有影响到实参a的值。因为在调用increment()函数的时候,实参a的值被复制了一份传给形参x,increment()函数对x的操作只是对这个复制的值的操作,并不会影响原来的a的值。

传引用

对于对象类型的参数,传递的是对象的引用,实际上就是对象在内存中的地址。当在函数中对对象的操作时,只是通过这个引用去访问这个对象在内存中的真实地址,所以可以说对象是通过引用传递的。当对象作为函数的参数传递时,函数中对对象的操作将影响到原始对象。

例如:

public class Test {
    public int x;
 
    public static void main(String[] args) {
        Test t = new Test();
        t.x = 10;
        increment(t);
        System.out.println(t.x);
    }
 
    public static void increment(Test obj) {
        obj.x++;
    }
}

上述程序中,increment()函数中对obj.x进行了操作,这个操作直接影响了t的成员变量x的值。因为在调用increment()函数时,传给obj的是对象的引用,即t对象在内存中的地址。所以在函数中对obj的操作会直接对t对象产生影响,假设在函数中进行的是引用操作,如改变对象的引用,则对原始对象并没有影响。

需要注意的是,使用引用作为函数参数时,同时也需要注意涉及到静态变量和非静态变量的影响。

静态变量

静态变量是属于类的,而不是属于某个具体的对象。在函数中对于静态变量的操作,将会对整个类中的静态变量产生影响。例如:

public class Test {
    public static int x;
 
    public static void main(String[] args) {
        x = 10;
        increment();
        System.out.println(x);
    }
 
    public static void increment() {
        x++;
    }
}

上述程序中,increment()函数对静态变量x进行了操作,它对整个类中的x值进行了自增操作。因为静态变量是属于类的,而类只有一个,所以在函数中对x的操作将对整个类中的静态变量x产生影响。

非静态变量

非静态变量是属于某个具体的对象的。在函数中对于非静态变量的操作,将只会对函数中所使用的对象产生影响。例如:

public class Test {
    public int x;
 
    public static void main(String[] args) {
        Test t = new Test();
        t.x = 10;
        increment(t);
        System.out.println(t.x);
    }
 
    public static void increment(Test obj) {
        obj.x++;
    }
}

上述程序中,只有在increment()函数中对t的x成员变量进行了自增操作,而没有对其他Test类的对象产生影响。因为t是作为参数传递给了increment()函数,所以只有在这个函数中使用的t对象才会受到影响。

总结

传值和传引用是Java函数调用的两种基本方式,对于基本数据类型采取传值方式,对于对象类型采取传引用方式。在使用传引用时需要注意对静态变量和非静态变量的处理,不同类型的变量在函数中的操作会有不同的影响。在进行函数设计时需要根据具体情况来选择传值或传引用方式,以达到最优的效果。