美文网首页
java中final关键字的用法和注意点(待更新)

java中final关键字的用法和注意点(待更新)

作者: 爱吃苹果的西瓜 | 来源:发表于2019-07-15 14:51 被阅读0次
    关键字 基础用法 误区
    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采用的是值传递,对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

    相关文章

      网友评论

          本文标题:java中final关键字的用法和注意点(待更新)

          本文链接:https://www.haomeiwen.com/subject/gajnkctx.html