1.参数传递与调用
参数调用一般采用的使“按值传递”,也就使说java的方法得到的,使参数值得一个副本。具体来讲,方法不能修改传递给它得任何参数变量的值。
就像下面这个例子:
double percent=10;
harry.raiseSalary(percent);
不管raiseSalary方法进行何种操作,percent本身的值都是不会有任何的改变的,还是10。
但是,如果参数是“对象的引用”呢?就像我们写c/c++的时候一样,这个时候,产生的效果就完全不一样了。
public static void trip(Employee x){
x.raiseSalary(200);
}
harry=new Employee(...);
trip(harry);
毫无疑问,这次传递的似乎就是一个harry的引用,这个时候,方法对其进行操作。
对上面的方式进行分析:
这种传参方式,其实传递的是对象引用的副本,只不过,这个副本跟传入的引用所指向的,是同一块区域。方法结束后,传入的副本不再使用,而原来的引用仍然指向那个已经被改变的区域。
但是!!!这个跟c++等语言所设计的传参方式一样吗?当然不!
下面我们来看看具体的区别:
首先,编写一个交换两个Employee对象的方法:
public static void swap(Employee x,Employee y){
Employee temp=x;
x=y;
y=temp;
}
var a=new Employee("Qks");
var b=new Employee("Kqs");
swap(a,b);
上面的结果是怎么样的呢?
很显然,这两个对象并没有被交换,这在c++等语言里完全不是这样的。究其原因,是因为,方法交换的,是这两个对象的副本。而这两个副本在结束的时候就被丢弃了,原来的引用也并没有产生丝毫的变化。这个案例说明,java对对象采用的不是按引用调用,实际上,对象引用是按值传递的。
总结一下java对方法参数能做什么和不能做什么:
1.方法不能修改基本数据类型的参数(数值型货布尔型)
2.方法可以改变对象参数的状态
3.方法不能让对象参数引用一个新的对象
下面是全部说明程序
/**
* This program demonstrates parameter passing in Java.
*
* @author Cay Horstmann
* @version 1.01 2018-04-10
*/
public class ParamTest {
public static void main(String[] args) {
/*
* Test 1: Methods can't modify numeric parameters
*/
System.out.println("Testing tripleValue:");
double percent = 10;
System.out.println("Before: percent=" + percent);
tripleValue(percent);
System.out.println("After: percent=" + percent);
/*
* Test 2: Methods can change the state of object parameters
*/
System.out.println("\nTesting tripleSalary:");
var harry = new Employeethree("Harry", 50000);
System.out.println("Before: salary=" + harry.getSalary());
tripleSalary(harry);
System.out.println("After: salary=" + harry.getSalary());
/*
* Test 3: Methods can't attach new objects to object parameters
*/
System.out.println("\nTesting swap:");
var a = new Employeethree("Alice", 70000);
var b = new Employeethree("Bob", 60000);
System.out.println("Before: a=" + a.getName());
System.out.println("Before: b=" + b.getName());
swap(a, b);
System.out.println("After: a=" + a.getName());
System.out.println("After: b=" + b.getName());
}
public static void tripleValue(double x) // doesn't work
{
x = 3 * x;
System.out.println("End of method: x=" + x);
}
public static void tripleSalary(Employeethree x) // works
{
x.raiseSalary(200);
System.out.println("End of method: salary=" + x.getSalary());
}
public static void swap(Employeethree x, Employeethree y) {
Employeethree temp = x;
x = y;
y = temp;
System.out.println("End of method: x=" + x.getName());
System.out.println("End of method: y=" + y.getName());
}
}
class Employeethree // simplified Employee class
{
private String name;
private double salary;
public Employeethree(String n, double s) {
name = n;
salary = s;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
}