就是在传参时是个final的对象的话,这个没有很好的理解
能给详细讲解下吗?有例子吗?==================
还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说您可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样您在方法中对对象变量的修改也会影响到调用语句中的对象变量,当您在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止您无意的修改而影响到调用方法。
=========================================================没能很好的理解
能给详细讲解下吗?有例子吗?==================
还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说您可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样您在方法中对对象变量的修改也会影响到调用语句中的对象变量,当您在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止您无意的修改而影响到调用方法。
=========================================================没能很好的理解
比如:
public void test(final List list){
list = new ArrayList(); //会报错
list.remove("xxx"); //删除list里的元素,正确
}
public static void main(String[] args){
List l1 = new ArrayList();
l1.add("xxx");
test(l1);
}所以说,在方法定义这个final是没有意义的,因为实际上都是传值。除基本类型,参数是对象类型的变量实际上它只是传一个“指针变量”的拷贝,就是传递了一个拷贝的地址值,对这个参数如何操作指向都不会影响到原来的对象变量的指向,但会更改这个地址值指向的对象的内部数据!如上,l1对象在内存中的值实际上是一个地址值,这个地址是指向一个ArrayList对象内存区域。
当你调用test(l1)时, 实际上你可以把这条语句看成这样:
{
final List list = l1;
list = new ArrayList(); //会报错
list.remove("xxx"); //删除list里的元素,正确
}
如果参数是一个基本数据类型,上面这句话很好理解。
换成一个“对象的引用”,就容易把人绕晕了。
加final的主要目的是防止出现不必要的错误.例如:
validate方法本意是改变传进来user的status
public void validate(User user){
if(user! null && user.getId() > 0){
user.setStatus(true);
}
}
如果不加final,代码的行为就错了,如下
public void validate(User user){
user = anotherUser; //只是举一个例子
if(user! null && user.getId() > 0){
user.setStatus(true);
}
}