首先,也是最重要的一条:
Java程序设计语言总是采用值传递。
在值传递中,最重要的就是要理解副本这个概念。
Java中所有的对象都是存储在堆中的。
接下来,直接上代码:
1.首先是Employee类,为测试辅助类。
package com.hust.methods;
public class Employee {
private String name;
private double salary;
private int id;
public Employee(String name, double salary, int id) {
this.name = name;
this.salary = salary;
this.id = id;
}
public double getSalary() {
return salary;
}
public void raiseSalary(double x) {
salary = this.salary * x;
}
}
2.测试主题类:
package com.hust.methods;
public class TestMain {
public static void main(String[] args) {
System.out.println("********************分割线************************");
System.out.println("第一条规则:一个方法不可能修改一个基本数据类型的参数:");
// 第一条规则:一个方法不可能修改一个基本数据类型的参数
int percent = 10;
System.out.println("调用方法之前 percent=" + percent);
tripleValue(percent);
System.out.println("调用方法之后 percent=" + percent);
System.out.println("********************分割线************************");
System.out.println("第二条规则:一个方法可以改变一个对象参数的状态:");
// 第二条规则:一个方法可以改变一个对象参数的状态
Employee test = new Employee("ffff", 3000.00, 1);
System.out.println("调用方法之前 salary=" + test.getSalary());
tripleSalary(test);
System.out.println("调用方法之后 salary=" + test.getSalary());
System.out.println("********************分割线************************");
System.out.println("第三条规则:一个方法不能让对象参数引用一个新的对象:");
//第三条规则:一个方法不能让对象参数引用一个新的对象
Employee aaa = new Employee("aaa", 200.00, 1);
Employee bbb = new Employee("bbb", 300.00, 2);
System.out.println("交换前 aaa的Salary=" + aaa.getSalary());
System.out.println("交换前 bbb的Salary=" + bbb.getSalary());
swap(aaa, bbb);
System.out.println("交换后 aaa的Salary=" + aaa.getSalary());
System.out.println("交换后 bbb的Salary=" + bbb.getSalary());
System.out.println("********************分割线************************");
}
// 定义一个方法,看看能否改变参数值
public static void tripleValue(int x) {
x = 3 * x;
}
// 定义一个方法,看看能否改变对象的状态
public static void tripleSalary(Employee e) {
e.raiseSalary(3.0);
}
// 定义一个方法,看看能否交换对象
public static void swap(Employee a, Employee b) {
Employee temp = a;
a = b;
b = temp;
}
}
3.接下来就是打印输出的
********************分割线************************
第一条规则:一个方法不可能修改一个基本数据类型的参数:
调用方法之前 percent=10
调用方法之后 percent=10
********************分割线************************
第二条规则:一个方法可以改变一个对象参数的状态:
调用方法之前 salary=3000.0
调用方法之后 salary=9000.0
********************分割线************************
第三条规则:一个方法不能让对象参数引用一个新的对象:
交换前 aaa的Salary=200.0
交换前 bbb的Salary=300.0
交换后 aaa的Salary=200.0
交换后 bbb的Salary=300.0
********************分割线************************
结论:在Java中没有指针的概念,基本类型都是值传递,引用类型都是地址的值传递。
对于值传递和引用传递的区别就是,值传递新开辟内存空间来存储副本,引用传递则是
指向同一块内存空间。修改值传递的副本,不会影响原本的值;但是,修改引用传递,
无论是原来的还是新的,都会修改同一个内存空间的值。