javase参数传递机制(值传递)

java中所有的参数传递都是值传递,也就是说传递的是值的副本,而不是原件,因此,副本的改变不会影响原件。

1、值传递的类型

(1)基本数据类型参数的传递

传递的是值的副本,副本改变不会影响原件

(2)引用类型参数的传递

传递的是实参的引用的副本,引用类型指的是对象的地址,因此,副本和原参数指向了同一个地址,改变副本指向地址对象的值,原参数的值也就跟着改变了。

public class Student {
    private String name;
    private Integer age;
    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public void testPara(Student student1){
         student1.name="zhang";
    }

    public static void main(String args[]){
        Student student=new Student("zhai",12);
        student.testPara(student);
        System.out.println(student.name);
    }
}

程序运行产生的结果为zhang,因为,student对象的引用和student1对象的引用指向的是同一个地址,student1将对象的值改变后student对象也发生了改变。

public class Student {
    private String name;
    private Integer age;
    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public void testPara(Student student1){
        student1.name="zhang";
    }

    public void testPara1(Student student2){
        student2=new Student("liu",11);
    }

    public static void main(String args[]){
        Student student=new Student("zhai",12);
        student.testPara(student);
        System.out.println(student.name);

        student.testPara1(student);
        System.out.println(student.name);
    }
}
zhang
zhang

第一步,student和student1对象的引用指向同一个对象:

 student1将name属性进行了修改:

 第三步,student2和student对象的引用指向同一个对象:

 由于testPara1方法内对student2对象的引用创建了新的对象,因此,student2又指向了这个新创建的对象:

 2、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

  • 是值传递,Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对象的引用是永远不会改变的。
  •  值传递,如果形参的值发生改变,但是实参的值是不会改变的,因为形参只是实参的一个拷贝
public class Alpha {
    public static void change(int a,int b){
        int temp;
        temp=a;
        a=b;
        b=temp;
    }
    public static void main(String[] args) {
        int num1=1,num2=9;
        change(num1,num2);
        System.out.println(num1+"   "+num2);
    }
}
  • 引用传递:在内存中没有产生实参的副本,直接对实参进行操作。数据量较大时可以节省空间。

不能理解为参数是什么类型就是什么传递

原文地址:https://www.cnblogs.com/zhai1997/p/12532784.html