今天抽了点时间继续啃java核心基础,即使出来做web挺长时间了,始终觉得基础极其重要。
遇到了java参数的传递类型,豁然开朗之时不忘写下记录。
java中采用的总是值传递,包括对对象参数的传递,采用的也是值传递!
首先,最普通的数据类型 例如 :
int a = 10 ;
int b = 20 ;
public void add(int a , int b){
a = a + 10 ;
b = b+ 10 ;
}
结果是 : a 依旧为10 b 依旧为20
其次:
public Employee {
private Double salary;
...
}
public test {
public static void main(Stirng[] args){
Employee e = new Employee() ;
changeVal(e);
//之后输入 e的薪水 会发现 e的薪水的确加了 100.
}
public static void changeVal(Employee e){
e.setSalary(e.getSalary() + 100 );
}
}
结果:e的薪水状态值发生了改变,在方法调用是,changeVal(e) , 这个e拿到了相同的引用地址,然后在方法内部时,对薪水状态发生了改变,所以虽然方法
走完后,e被废弃了,但是同样引用地址对应的变量值确确实实也发生了变化,所以状态被改变了。
最后:
java 对对象也是用的值传递,(即使给的是引用地址。)
Employee x = new Employee("X");
Employee y = new Employee("Y");
Employee.swap(x, y);
System.out.println(x);
System.out.println(y);
public static void swap(Employee x , Employee y){
Employee temp = x; //x 给了 temp temp持有x的引用
x = y; //x持有y的引用
y = temp; //y持有temp的引用 》》 结果 : y持有x的引用 最终 打印出来的却是大跌眼镜 X还是X Y还是Y
}
原因: 为什么最后x在tostring后发现还是原来的x y也还是原来的y?
其实在方法调用的时候 , swap(x,y) 这里的x 和y是原有的一份拷贝, 所以参数x和参数y在内部如何改变指向,都只是改变了参数x和参数y的指向,而不会改变真正x和y的指向。
总结:
1.值变量在函数结束后还是不会被改变。
2 函数可以改变对象的状态。
3 函数不能改变对象的引用。