Java 方法参数

Java 程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数的内容。

例如,下面的调用:

double percent = 10;
harry.raiseSalary(percent);
在方法调用之后,percent的值还是10。代码如下:

public class ParamTest {
	public static void main(String [] args){
		System.out.println("Testing tripleValue:");
		double percent = 10;
		System.out.println("Before:percent=" + percent);
		tripleValue(percent);
		System.out.println("After:percent=" + percent);
		
	}
	public static void tripleValue(double x){
		 x = 3*x;
		 System.out.println("End of method: x="+x);
	}

}

运行结果:Java 方法参数_第1张图片



可以看到,无论怎样,调用这个方法之后,percent的值还是10。看一下具体的执行过程:

1)x被初始化为percent值的一个拷贝(也就是10)。

2)x被乘以3后等于30。但是percent仍然是10。

3)这个方法结束之后,参数变量x不再使用。


Java 方法参数_第2张图片

方法参数共有两种类型:

1、基本数据类型(数字、布尔值)。

2、对象引用。

我已经知道,一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不一样了,可以利用下面这个方法实现将一个雇员是的薪金提高两倍的操作:

public static void tripleSalary(Employee x)
{
  x.raiseSalary(200);

}
具体代码:

public class ParamTest {
	public static void main(String [] args){
		System.out.println("\nTesting tripleSalary:");
		Employee harry = new Employee("Harry",50000);
		System.out.println("Before: salary=" + harry.getSalary());
		tripleSalary(harry);
		System.out.println("After: salary=" + harry.getSalary());
		
		
	}
	public static void tripleSalary(Employee x){
	x.raiseSalary(200);
	System.out.println("End of method: salary=" + x.getSalary());
	}

}
public 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;
    	
    }


}
运行结果:
Java 方法参数_第3张图片




具体执行过程:

1、x被初始化为harry值的拷贝,这里是个对象的引用。

2、raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200%。

3、方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。


Java 方法参数_第4张图片

     由上可知,实现一个改变对象参数状态的方法并不是一件难事。因为,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用统一个对象。

很多程序设计语言提供了两种参数传递的方式:值调用和引用调用。有些人认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种理解有一定的普遍性,所以下面给出一个范反例来详细阐述。

     首先,编写一个交换两个雇员对象的方法:

public static void swap(Employee x,Employee y){
   Employee temp=x;
   x = y;
   y = temp;
}

如果Java设计语言对对象采用的是引用调用,这个方法就应该能够实现交换数据的效果:

Emloyee a = new Emloyee("Alice",...);
Emloyee a = new Emloyee("Bob",...);
swap(a,b);
但是,方法并没有改变存储在变量a和b的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。具体代码:

public class Ey {
	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());
		
	}
	public static void main(String [] args){
		Employee a = new Employee("Alice",200);
		Employee b = new Employee("Bob",400);
		System.out.println("\nTesting swap:");
		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 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;
    	
    }


}


运行结果: Java 方法参数_第5张图片

最终,白费力气。在方法结束时参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象

Java 方法参数_第6张图片

    这个过程说明:Java程序设计语言对对象采用的不是引用调用,实际上,对象引用进行的是值传递。

    下面总结一下Java程序设计语言中方法参数的使用情况:

    1、一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。

    2、一个方法可以改变一个对象参数的状态。

    3、一个方法不能让对象参数引用一个新的对象。






你可能感兴趣的:(Java 方法参数)