选用教材:《Java核心技术卷一》
第四章 对象与类
不同于C语言等其他语言,java程序设计语言中仅有一种参数传递方式,即按值传递。
1、方法可以修改按引用传递的变量的值,但不能修改按值传递的变量的值;
2、方法不能修改基本数据类型的参数,但能修改对象引用类型的参数;
3、方法不能让一个对象参数引用一个新的对象(对象的内容/状态可以在被调用的方法内改变,但对象的引用是永远不会改变的)。
4、示例代码:
package homework; 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); System.out.println("\nTesting tripleSalary");//测试能否改变对象引用类型的值 var harry=new Employee("Harry",50000); System.out.println("Before:salary="+harry.getSalary()); tripleSalary(harry); System.out.println("After:salary="+harry.getSalary()); System.out.println("\nTesting swap:");//测试方法对于对象引用类型的参数,是按值传递,还是按引用传递 var a=new Employee("Alice",70000); var 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 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()); } } 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; } }
5、打印结果:
Testing tripleValue: Before:percent=10.0 End of method:x=30.0 After:percent=10.0 Testing tripleSalary Before:salary=50000.0 End of method:salary=150000.0 After:salary=150000.0 Testing swap: Before:a=Alice Before:b=Bob End of method:x=Bob End of method:y=Alice After:a=Alice After:b=Bob
6、总结
纠结了两天的知识点,在今天终于明白了。java的按值传递说白了就是将变量的值copy一份传给方法,之后方法进行的任何操作,都与变量原本的值没有任何关系。
其中比较特殊的是对象引用类型参数的变化,对象的状态可以通过方法来进行修改。
之前学过的知识中,举过这样一个例子:
Date deadline=new Date();
这行简单的代码包括了3个部分:
①创建一个Date类型的对象;
②引用新创建的这个Date对象的值;
③将对象引用的值赋给变量deadline;
对象引用类型的参数本来指向的就是对象的地址,所以调用方法时会直接改变对象的状态;
同时对象引用只可能指向一个对象,不可能再指向新的对象,所以代码中的swap方法行不通。
这里有一个思维误区就是,被赋值的那个变量名是可以改变的,从a变到z都行;但是变量名的改变不代表对象引用的改变。
原文:https://www.cnblogs.com/yizhinailu/p/12535607.html