日期:2014-05-20 浏览次数:20998 次
public class PramTest {
public static void main(String[] args) {
/**
* Test 1: 方法无法修改数值参数.
*/
System.out.println("Testing tripleValue");
double percent = 10;
System.out.println("Before: percent="+percent);
tripleValue(percent);
System.out.println("After: percent="+percent);
/**
* Test 2: 方法可以改变对象参数状态
*/
System.out.println("\nTesting tripleSalary");
Employee harry = new Employee("Harry", 50000);
System.out.println("Before: salary="+harry.getSalary());
tipleSalary(harry);
System.out.println("After: salary="+harry.getSalary());
/**
* Test 3: 方法不能将新的对象赋给对象参数
*/
System.out.println("\nTesting swap:");
Employee a = new Employee("Alice", 70000);
Employee b = new Employee("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){
x = 3 * x;
System.out.println("End of method: x="+x);
}
public static void tipleSalary(Employee x){
x.raiseSalary( 200 );
System.out.println("End of method: salay="+ 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());
}
}
public class Employee {
private String name;
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public void raiseSalary(double byPrecent){
double raise = salary * byPrecent / 100;
salary += raise;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
}
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("test");
change1(list);
System.out.println("change1:" + list);
change2(list);
System.out.println("change2:" + list);
}
public static void change1(List<String> list) {
//首先要知道,每个方法都有自己的栈,每个方法内部的变量属于自己的栈,
//也就是说change1方法的list和main方法的list不是同一个变量
//但是它们都指向同一个List对象,也就是说main方法的list引用一个List对象,
//change1方法的list也引用了和main方法的list相同的List对象
list = new ArrayList<String>(); //要注意这个地方和change2方法的区别
//所以这里改变了方法内部的list指向,让它指向一个新的List对象,
//但是方法外部的list的指向并没有改变,
//也就是说这时候方法内部的list引用的对象已经和方法外部的list引用的对象不是同一个了
list.add("change1"); /
//所以这里对list所作的任何操作只影响方法内部的list所引用的对象,
//对方法外部的list所引用的对象没有任何影响,所以方法外部的list没有任何变化
}
public static void change2(List<String> list) {
list.add("change2");
//而这个方法中,方法内部的list的指向没有发生任何改变
//还是和方法外部的list引用相同的一个对象
//所以对方法内部的list所作的任何操作都会影响list所引用的对象
//因为方法外部的list也引用该对象,该对象被方法内部的list改变了,
//所以方法外部的list也能感知变化
}
}