Java 基础——值传递和引用传递

在编程的世界里,理解数据传递的方式是至关重要的。今天,我们通过分析一段Java代码,来深入探讨值传递和引用传递的概念,以及它们如何影响程序的运行结果。

1. 代码展示

package com.company.hbccpc;
public class Maink {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        String zhang = "zhangsan";
        String l1 = "lis1";
        Peoplek i = new Peoplek("i");
        Peoplek j = new Peoplek("j");

        test1(a, b);
        System.out.println(a + " " + b);

        test1(zhang, l1);
        System.out.println(zhang + " " + l1);

        test1(i, j);
        System.out.println(i.name + " " + j.name);
    }

    private static void test1(Peoplek i, Peoplek j) {
        String a = i.getName();
        i.name = j.getName();
        j.name = a;
    }

    private static void test1(String zhang, String l1) {
        String a = zhang;
        zhang = l1;
        l1 = a;
    }

    private static void test1(int a, int b) {
        int c = a;
        a = b;
        b = c;
    }
}

class Peoplek {
    String name;

    public Peoplek(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2. 输出结果分析 

 int  类型变量的交换:

- 调用  test1(a, b)  后, System.out.println(a + " " + b)  的输出是  3 4 。
- 原因在于Java中基本数据类型(如  int )是值传递。在  test1(int a, int b)  方法中,形参  a  和  b  是实参  a  和  b  的副本。当在方法内交换形参  a  和  b  的值时,并不会影响到  main  方法中的实参  a  和  b 。

String  类型变量的交换:

- 调用  test1(zhang, l1)  后, System.out.println(zhang + " " + l1)  的输出是  zhangsan lis1 。
- 虽然  String  是引用类型,但在Java中, String  对象是不可变的。并且方法调用时传递的是引用的副本(值传递)。在  test1(String zhang, String l1)  方法中,对形参  zhang  和  l1  的重新赋值,只是改变了形参引用所指向的对象,而不会影响到  main  方法中实参  zhang  和  l1  所指向的对象。

自定义 Peoplek  类型变量的交换:

- 调用  test1(i, j)  后, System.out.println(i.name + " " + j.name)  的输出是  j i 。
- 因为  Peoplek  是引用类型,并且在Java中对象的传递是引用传递(本质上还是值传递,传递的是对象引用的副本)。在  test1(Peoplek i, Peoplek j)  方法中,通过操作对象的属性( name ),由于传递的是对象引用的副本,这个副本指向的是与实参相同的对象,所以对对象属性的修改会影响到  main  方法中的对象。

3. 涉及知识点总结

值传递:
- 对于基本数据类型(如  byte 、 short 、 int 、 long 、 float 、 double 、 char 、 boolean ),在方法调用时,实参的值被复制给形参。在方法内对形参的修改不会影响实参的值。
- 对于  String  类型,虽然它是引用类型,但由于其不可变性以及方法调用时传递引用副本的特性,表现类似值传递。对形参引用的重新赋值不会影响实参引用。
引用传递:
- 对于自定义类(如  Peoplek )等引用类型,在方法调用时,传递的是对象引用的副本。通过这个副本可以操作对象的属性,因为副本和实参引用指向同一个对象。所以在方法内对对象属性的修改会反映到  main  方法中的对象上。

你可能感兴趣的:(java,开发语言)