关键字 | 基础用法 | 误区 |
---|---|---|
final | 修饰类、方法、变量 |
来自《Java编程思想》的一段话
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“
public class TestFinal {
public static void main(String[] args){
TestFinal testFinal = new TestFinal();
StringBuffer buffer = new StringBuffer("hello");
testFinal.changeValue(buffer);
System.out.println(buffer);
}
public void changeValue(final StringBuffer buffer){
//final修饰引用类型的参数,不能再让其指向其他对象,但是对其所指向的内容是可以更改的。
//buffer = new StringBuffer("hi");
buffer.append("world");
}
}
运行结果
helloworld
运行这段代码就会发现输出结果为 helloworld。很显然,用final进行修饰虽不能再让buffer指向其他对象,但对于buffer指向的对象的内容是可以改变的。现在假设一种情况,如果把final去掉,结果又会怎样?看下面的代码:
public class TestFinal {
public static void main(String[] args){
TestFinal testFinal = new TestFinal();
StringBuffer buffer = new StringBuffer("hello");
testFinal.changeValue(buffer);
System.out.println(buffer);
}
public void changeValue(StringBuffer buffer){
//buffer重新指向另一个对象
buffer = new StringBuffer("hi");
buffer.append("world");
System.out.println(buffer);
}
}
运行结果
hiworld
hello
从运行结果可以看出,将final去掉后,同时在changeValue中让buffer指向了其他对象,并不会影响到main方法中的buffer。原因在于java采用的是值传递,对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。
网友评论