当Java方法的参数用final修饰:
- 如果输入参数是简单类型,那么在被调用函数内部不能修改参数的值。
- 如果输入参数是对象的引用,那么在被调用函数内部不能改变对象的引用,即必须引用同一个对象,但可以修改对象的属性。
代码示例:
package com.thb;
public class Test1 {
public static void main(String[] args) {
Another another = new Another();
System.out.println("简单类型入参验证:");
int num = 10;
System.out.println("在调用函数中,入参 num = " + num);
another.method1(10);
another.method2(10);
System.out.println("-------------------------");
System.out.println("对象类型入参验证:");
Point point = new Point(1, 2);
System.out.println("在调用函数中,point对象:" + point);
System.out.println("改变对象的属性前,在调用函数中:point.x = " + point.getX());
another.method3(point);
another.method4(point);
System.out.println("在被调用函数中改变对象的属性后,在调用函数中得到的值:point.x = " + point.getX());
}
}
package com.thb;
public class Another {
public void method1(int num) {
num += 20; // 入参为简单类型,可以改变入参的值
System.out.println("在method1中, 入参没用final修饰,改变了入参的值,num = " + num);
}
public void method2(final int num) {
// 入参为用final修饰的简单类型,不能修改参数的值。如果去掉下面代码前的注释,会编译报错
//num = 20;
System.out.println("在method2中, 入参用final修饰,入参值无法改变, num = " + num);
}
public void method3(Point point) {
point = new Point(2, 4); // 指向另外一个新创建的对象
System.out.println("在method3中,入参没用final修饰,指向另外一新建对象: " + point);
}
public void method4(final Point point) {
point.setX(0); // 指向同一对象,但可以改变对象的属性
System.out.println("在method4中,入参用final修饰,指向同一个对象: " + point);
}
}
package com.thb;
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public int getX() {
return this.x;
}
}
执行结果: