为什么Java中只有值传递

Java总是按值传递参数,无论是基本数据类型还是对象引用。对于基本类型,传递的是副本;对于对象,传递的是对象引用的副本,意味着方法内部对对象状态的改变会影响到原始对象,但不会改变引用本身。通过例子展示了即使在对象交换方法中,对象引用也是按值传递,对象实例并未真正交换。
摘要由CSDN通过智能技术生成

1.基本数据类型

  1. Java中总是采用按值掉哦那个,方法得到的是所有参数的一个副本,方法并不修改给它的任何参数变量的内容。

  2. 程序如下

    public class Test2 {
    
        private static int i = 10;
    
        public static void transfer(int i){
            i = i * 3;
        }
    
        public static void main(String[] args){
            transfer(i);
            System.out.println(i);//输出为10
        }
    }
    
    

    很明显使用transfer方法并没有改变i的值,i当作参数被传入时,只是传入一个副本,只在这个方法内有效。当这个方法执行结束之后,i依然是10,这足以说明基本数据类型在Java中是按值传递的,若是按引用传递那应该i的值被改变。

2.对象引用

  1. 一个Employee类

    public class Employee {
    
        private String name;
        private Integer salary;
    
        public Employee(String name, Integer salary) {
            this.name = name;
            this.salary = salary;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getSalary() {
            return salary;
        }
    
        public void setSalary(Integer salary) {
            this.salary = salary;
        }
    
    
        /**
         * 将员工工资增长三倍的方法
         * @param employee 传入一个employee对象
         */
        public void transfer(Employee employee){
            employee.salary = employee.salary*3;
        }
    }
    
  2. 一个测试类

    public class EmployeeTest {
        public static void main(String args[]){
            //创建一个Employee对象的对象引用e,此时e并没有指向哪个对象。
            Employee e;
            //e指向new Employee("dd",232)这个对象实例
            e = new Employee("dd",232);
            //调用增长工资方法
            e.transfer(e);
            System.out.println(e.getSalary());//输出696
        }
    }
    
  3. 可以看到,当调用了transfer升高工资的方法的时候,这时候调用getSalary()方法输出的是三倍工资,这时候会怀疑Java中的对象是否是按引用调用而不是按值调用。其实不是,上面第四行代码,创建了一个对象引用,此时这个对象引用还没有指向某个对象实例。第六行new 一个对象之后,e这个对象引用指向了这个对象实例。一个对象引用可以指向0个或1个对象实例。当第八行把e这个对象引用当作参数传递进去的时候,这时候会生成一个e的对象引用的副本,这个副本和e指向的是同一个对象实例。一个对象实例可以有n个对象引用指向它。在transfer方法中操作这个副本,其改变了这个对象实例。当这个方法结束之后,副本被弃用,但是e这个 对象引用指向的还是这个对象实例,而在transfer中改变了这个对象实例的状态,所以调用getSalary()后输出的是三倍工资。但这并不是说Java中对象是按引用传递的,具体看下面这个程序。

  4. 一个交换 两个对象的方法

    public class EmployeeTest {
    
        public static void swap(Employee a,Employee b){
            Employee temp;
            temp = a;
            a = b;
            b = temp;
            System.out.println(a.getName());//输出bb
            System.out.println(b.getName());//输出aa
        }
    
        public static void main(String args[]){
           Employee e1 = new Employee("aa",11);
           Employee e2 = new Employee("bb",22);
           swap(e1,e2);
           System.out.println(e1.getName());//输出aa
           System.out.println(e2.getName());//输出bb
    
        }
    }
    
  5. 上面的程序,当把e1和e2当作参数传递进去的时候,此时会生成这两个对象的副本,进行对象交换的方法swap只是交换了两个 对象的副本的对象实例。当方法结束之后,副本被弃用,e1和e2所指向的对象实例并没有发生改变。如果是按引用调用,那么e1和e2所指向的对象实例也应该被交换事实并没有。Java中对对象采用的不是按引用调用,实际上,对象引用是按值传递的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值