一般情况下(例如C++),将参数传递给方法的方式有有按值调用和引用调用
- 按值调用(call by value)表示方法接收调用者提供的数值
- 引用调用(call by reference)表示方法接收的调用者提供的变量地址
而Java中,参数的传递方式只有按值调用
即方法得到所有参数值的一个拷贝,因此,方法不能修改传递给它的任何参数变量的内容
方法参数共有两种类型:基本数据类型(数据,布尔值),对象引用
例1:
double percent=10;
harry.raiseSalary(percent);//将percent的值传递给harry.raiseSalary(),percent的值仍是10
例2:
public static void tripleValue()
{
x=x*3;
}
//调用该方法
double percent=10;
tripleValue(percent);
将x初始化为percent的值后执行函数,调用完后参数变量的值不再使用。
例3:
对象引用作为参数,实现将雇员工资提升两倍的操作
public static void tripleSalary(Employee x)
{
x.raiseSalary(2);
}
//调用提供的参数
harry=new Employee(8000);
tripleSalary(harry);
例4:
证明Java对对象采用的不是引用调用
交换两个雇员对象
public static void swap(Employee x,Employee y)
{
Employee temp=x;
x=y;
y=temp;
}
Employee a=new Employee("Alice");
Employee b=new Employee("Jack");
swap(a,b);
参数x,y分别被初始化为两个对象引用的拷贝,引用该方法时交换的是这两个对象的拷贝,调用方法swap结束后,参数变量x,y被丢弃,对象变量a,b仍然是这个方法调用前所引用的对象。
总结:Java中方法参数的使用情况;
1.一个方法不能修改一个基本数据类型的参数(数值型或布尔型)如例1;
2.一个可以改变一个对象参数的状态如例2,例3;
3.一个方法不能让对象参数引用一个新的对象,如例4。
package ClassesAndProjects;
/*
* This code demonstrates parameter passing in java
* son.7.27.2019
*/
public class ParameterTest {
public static void main(String[] args) {
//Test1:方法不能修改基本数据类型的参数
System.out.println("Test1;tripleValue:");
double percent=10;
System.out.println("before:persenct="+percent);
tripleValue(percent);
System.out.println("after:persenct="+percent);
//test2:2.一个可以改变一个对象参数的状态
System.out.println("\nTes2:tripleSalary:");
Employee harry=new Employee("Harry",8000);
System.out.println("before:Salary="+harry.getSalary());
tripleSalary(harry);
System.out.println("after:Salary="+harry.getSalary());
//test3:一个方法不能让对象参数引用一个新的对象
System.out.println("\nTest3:swap");
Employee a=new Employee("Alice",7000);
Employee b=new Employee("Jack",5000);
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)
{
x=x*3;
System.out.println("End of method:x="+x);
}
public static void tripleSalary(Employee x)
{
x.raiseSalary(200);
System.out.println("End of method:salary="+x.getSalary());
}
public static void swap(Employee x,Employee y)
{
Employee temp=x;
x=y;
y=temp;
System.out.println("End of method:x="+x.getName());
System.out.println("End of method:y="+y.getName());
}
static class Employee
{
private String name;
private double salary;
public Employee(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;
}
}
}
运行结果如下: