关于java方法参数中,值传递与引用传递问题

内容参考javacore10,


方法参数共有两种类型 :

• 基本数据类型

• 对象引用 。


package com.wnsh.v1ch04;

import com.alibaba.fastjson.JSONObject;

import java.time.LocalDate;

/**
 * @Description: Created by Administrator on 2018/4/15.
 */
public class Employee {
    private String name;
    private double salary;
    private LocalDate hireDay;

    public Employee(String n, double s, int year, int month, int day)
    {
        name = n;
        salary = s;
        hireDay = LocalDate.of(year, month, day);
    }

    public String getName()
    {
        return name;
    }

    public double getSalary()
    {
        return salary;
    }

    public LocalDate getHireDay()
    {
        return hireDay;
    }

    public void raiseSalary(double byPercent)
    {
        double raise = salary * byPercent / 100;
        salary += raise;
    }

    @Override
    public String toString() {
        return JSONObject.toJSON(this).toString();
    }
}


package com.wnsh.v1ch04;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: Created by Administrator on 2018/4/15.
 */
public class EmployeeTest {
    /**
     * 1 ) x 被初始化为 percent 值的一个拷贝 ( 也就是 10 )
     * 2 ) x 被乘以 3 后等于 30。但是 percent 仍然是 10。
     * 3 ) 这个方法结束之后, 参数变量X 不再使用。
     * <p>
     * 可以看出:一个方法不可能修改一个基本数据类型的参数
     */
    @Test
    public void test1() {
        double percent = 10;
        System.out.println(percent);// 打印10.0
        EmployeeTest.tripieValue(10);
        System.out.println(percent);// da打印10.0
    }
    public static void tripieValue(double x) {
        x = 3 * x;
    }


    /**
     * 1 ) X 被初始化为 harry 值的拷贝, 这里是一个对象的引用
     * 2 ) raiseSalary 方法应用于这个对象引用。
     * x和 harry 同时引用的那个 Employee 对象的薪金提高了 200 %。
     * 3 ) 方法结束后, 参数变量 x不再使用。 当然 , 对象变量 harry 继续引用那个薪金增至 3倍的雇员对象
     *
     * 可以看出:对象引用作为参数 ,可以很容易地利用下面这个方法实现将
     * 一个雇员的薪金提高两倍的操作
     */
    @Test
    public void test2() {
        Employee harry = new Employee("Carl Cracker", 10000, 1987, 12, 15);
        System.out.println(harry);//{"hireDay":"1987-12-15","name":"Carl Cracker","salary":75000.0}
        tripieSalary(harry);
        System.out.println(harry);//{"hireDay":"1987-12-15","name":"Carl Cracker","salary":225000.0}
    }
    public static void tripieSalary(Employee x) {
        x.raiseSalary(200);
    }


    /**
     *  认为 Java程序设计语言对对象采用的是引用调用是错误的
     *
     *  下面总结一下 Java 中方法参数的使用情况 :
     * • 一个方法不能修改一个基本数据类型的参数 ( 即数值型或布尔型 ) 。
     * • 一个方法可以改变一个对象参数的状态 。
     * •一个方法不能让对象参数引用一个新的对象
     */
    @Test
    public void test3() {
        Employee a = new Employee("A", 10000, 1989, 12, 15);
        Employee b = new Employee("B", 15000, 1986, 12, 1);
        System.out.println(a);//{"hireDay":"1989-12-15","name":"A","salary":10000.0}
        System.out.println(b);//{"hireDay":"1986-12-01","name":"B","salary":15000.0}
        swap(a,b);//a,b并没有交换
        System.out.println(a);//{"hireDay":"1989-12-15","name":"A","salary":10000.0}
        System.out.println(b);//{"hireDay":"1986-12-01","name":"B","salary":15000.0}

        swapValue(a,b);//a,b的薪水交换了
        System.out.println(a);//{"hireDay":"1989-12-15","name":"A","salary":15000.0}
        System.out.println(b);//{"hireDay":"1986-12-01","name":"B","salary":10000.0}

    }
    public static void swap(Employee x, Employee y) {
        Employee temp = x;
        x = y;
        y = temp;
    }
    public static void swapValue(Employee x, Employee y){
        double temp = x.getSalary();
        x.setSalary(y.getSalary());
        y.setSalary(temp);
    }

    @Test
    public void test4(){
        String a = "a";
        System.out.println(a);//a
        stringA(a);
        System.out.println(a);//a

        List<String> listB = new ArrayList<>();
        listB.add(a);

        System.out.println("listB  0:"+listB);//listB  0:[a]
        listTest(listB);
        System.out.println("listB  1:"+listB);//listB  1:[a, b]

    }
    public static void stringA(String x){
        System.out.println("before x="+x);//before x=a
         x = x+"b";
        System.out.println("after x="+x);//after x=ab
    }
    public static void listTest(List list){
        System.out.println("list 0:"+list);
        list.add("b");
        System.out.println("list 1:"+list);
    }
}

}总结:
     * • 一个方法不能修改一个基本数据类型的参数 ( 即数值型或布尔型 ) 。
     * • 一个方法可以改变一个对象参数的状态 。
     * •一个方法不能让对象参数引用一个新的对象


阅读更多

没有更多推荐了,返回首页