码迷,mamicode.com
首页 > 编程语言 > 详细

Java8中的final关键字详解

时间:2019-07-08 00:32:54      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:而且   必须   重写   内容   为什么   引用类型   赋值   lse   jdk   

final修饰类

当用final去修饰一个类的时候,表示这个类不能被继承。
将类定义成final后,结果只是禁止被继承。由于禁止了继承,所以一个final类中的所有方法都默认为final。
在自己设计一个类的时候,要想好这个类将来是否会被继承,如果可以被继承,则该类不能使用fianl修饰,在这里呢,一般来说工具类我们往往都会设计成为一个fianl类。在JDK中,String被设计为final类型。

public final class Feige {
    public final void say() {
        System.out.println(666);
    }
}

final修饰方法

final方法主要的作用:防止任何继承类重写此方法。若希望一个方法的行为在继承期间保持不变,不可被重写,就可以采取这种做法。
一个类的private方法会隐式的被指定为final方法。

public  class Feige {    
    public final void say() {
        System.out.println(666);
    }
}

final修饰成员变量

final修饰成员变量必须要赋初始值,而且是只能初始化一次。有两种方式:1、直接赋值 2、在构造方法中赋初值。
如果修饰的成员变量是基本类型,则表示这个变量的值不能改变。
如果修饰的成员变量是一个引用类型,则是说这个引用的地址的值不能修改,但是这个引用所指向的对象里面的内容还是可以改变的。

public class Feige {
    private final String name = "feige";
    private final String sex;
    private final static String hobby;
    
    public Feige() {
        sex = "男";
    }
    static {
        hobby="啪啪啪";
    }
}

深入了解final关键字

public static void main(String[] args)  {
     String a = "hello2"; 
     final String b = "hello";
     String d = "hello";
     String c = b + 2; 
     String e = d + 2;
     System.out.println((a == c));
     System.out.println((a == e));
}

结果:
true
false
为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b替换为它的值。而对于变量d的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化。

Java8中的final关键字详解

标签:而且   必须   重写   内容   为什么   引用类型   赋值   lse   jdk   

原文地址:https://www.cnblogs.com/feiqiangsheng/p/11148528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!