1.有时一个对象提供的服务太过复杂,就可以将一个方法分解为多个方法来进行设计,以建立一个理解性好的类结构设计。
2.另一个问题就是方法参数的传递方式。
参数传递实质上类似一条赋值语句,将实参保存值得副本赋给形参。在方法内部修改形参时,形参知识实参的一个副本,对形参的任何修改都不会影响实参。然而,如果将一个对象传给一个方法,实际上传递的是这个对象的引用。复制给形参的值是对象的地址。
下面可以看这个例子。
public class ParameterTester {
public static void main(String[] args) {
ParameterModifier modifier=new ParameterModifier();
int a1=111;
Num a2=new Num(222);
Num a3=new Num(333);
System.out.println("Before calling changevalues");
System.out.println("a1\ta2\ta3");
System.out.println(a1+"\t"+a2+"\t"+a3+"\n");
modifier.changeValues(a1, a2, a3);
System .out.println("After calling changevalues");
System.out.println("a1\ta2\ta3");
System.out.println(a1+"\t"+a2+"\t"+a3+"\n");
}
}
输出结果
Before calling changevalues
a1 a2 a3
111 222 333
Before change the values
f1 f2 f3
111 222 333
After change the Values:
f1 f2 f3
999 888 777
After calling changevalues
a1 a2 a3
111 888 333
调用的两个类如下
public class ParameterModifier {
public void changeValues(int f1,Num f2,Num f3) {
System.out.println("Before change the values");
System.out.println("f1\tf2\tf3");
System.out.println(f1+"\t"+f2+"\t"+f3+"\n");
f1=999; //只是将a1=111的副本赋给了f1.现在f1重新=999;对a1无影响。
f2.setValue(888); //形参名和实参名互为对方的别名。这句等于a2.setValue(888);
f3=new Num(777); /*改变了形参引用本身,使形参指向一个新对象。不会影响实参。
一开始复制给f3的是a3的地址,现在他指向了新的地址,对a3无影响*/
System.out.println("After change the Values:");
System.out.println("f1\tf2\tf3");
System.out.println(f1+"\t"+f2+"\t"+f3+"\n");
}
}
public class Num {
private int value;
public Num (int update) {
value=update;
}
public void setValue(int update) {
value=update;
}
public String toString () {
return value +"";
}
}