举例讲解Java中final关键字的用法

 更新时间:2016年06月15日 11:21:17   投稿:goldensun  
Java中的final关键字可以被用来修饰变量、方法和类等,意味着终结、不可改变,下面我们就来举例讲解Java中final关键字的用法:

1. final variable

final variable 就是一个常量,一旦被初始化就不可以被改变。

class Test1 {
 final double PI = 3.14; //常量的名称最好大写

 public Test1(){
  PI = 3.14;
 }

  void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
  Test1 t = new Test1();
  t.test();
 }
}

输出:

PI is: 3.14

(1)Blank final variable

在声明时未初始化的 final variable 被称作 blank final variable, blank final variable必须在 构造函数中被初始化,否则会抛出编译错误。

class Test1 {
 final double PI;

 Test1(){
 PI = 3.14; //在构造函数中初始化
 }

  void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}

输出:

PI is: 3.14

(2)Uninitialized static final variable

在声明阶段未初始化的 static final variable 只能在静态代码块中被初始化

class Test1 {
 static final double PI;

 static {
 PI = 3.14;
 }

  void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}

输出:

PI is: 3.14

2. final method

final method 不能被覆盖。也就是说子类可以调用父类的 fianl method,但是不能覆盖它。

class Test {
 static final double PI = 3.14;

  final void test(){
   System.out.println("PI is: " + PI);
  }
}

class Test1 extends Test{

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}

输出:

PI is: 3.14

3. final class

final calss 不能被继承

final class Test1 {
 static final double PI = 3.14;

  final void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}

输出:

PI is: 3.14

PS:java.lang.String类为什么设计成 final 的?
首先,先得清楚 final 这个关键字。
final的出现就是为了为了不想改变,而不想改变的理由有两点:设计或者效率。final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的。
了解了这一点,我们再看看问题:
(1)从设计上讲,
A、确保它们不会在子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。换言之,如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。
B、String 一旦被创建是不能被修改的,因为 java 设计者将 String 为可以共享的,下面这段是源码中的注释:
(2)从效率上讲:
A、设计成final,JVM才不用对相关方法在虚函数表中查询,而直接定位到String类的相关方法上,提高了执行效率。
B、Java设计者认为共享带来的效率更高。
总而言之,就是要保证 java.lang.String 引用引用的对象一定是 java.lang.String的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。

相关文章

  • Java NIO Files类读取文件流方式小结

    Java NIO Files类读取文件流方式小结

    本文主要介绍了Java NIO Files类读取文件流方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 面试官:详细谈谈Java对象的4种引用方式

    面试官:详细谈谈Java对象的4种引用方式

    这篇文章主要给大家介绍了java面试官常会问到的,关于Java对象的4种引用方式的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 从dubbo源码分析qos-server端口冲突问题及解决

    从dubbo源码分析qos-server端口冲突问题及解决

    这篇文章主要介绍了从dubbo源码分析qos-server端口冲突问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java中File文件操作类的超详细使用教程

    Java中File文件操作类的超详细使用教程

    File类在包java.io.File下、代表操作系统的文件对象(文件、文件夹),File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(文件夹)等功能,下面这篇文章主要给大家介绍了关于Java中File文件操作类的超详细使用教程,需要的朋友可以参考下
    2023-01-01
  • idea克隆maven项目的方法步骤(图文)

    idea克隆maven项目的方法步骤(图文)

    这篇文章主要介绍了idea克隆maven项目的方法步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java方法重写和super关键字实例详解

    java方法重写和super关键字实例详解

    这篇文章主要介绍了java方法重写和super关键字实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 自定义application.yml配置项方式

    自定义application.yml配置项方式

    这篇文章主要介绍了自定义application.yml配置项方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringBoot整合JWT(JSON Web Token)生成token与验证的流程及示例

    SpringBoot整合JWT(JSON Web Token)生成token与验证的流程及示例

    JSON Web Token(JWT)是一种开放的标准(RFC 7519),定义了一种紧凑的、自包含的方式来安全地在各方之间传输信息作为JSON对象,这篇文章主要给大家介绍了关于SpringBoot整合JWT(JSON Web Token)生成token与验证的相关资料,需要的朋友可以参考下
    2024-07-07
  • java学习DongTai被动型IAST工具部署过程

    java学习DongTai被动型IAST工具部署过程

    被动型IAST被认为是DevSecOps测试阶段实现自动化安全测试的最佳工具,而就在前几天,洞态IAST正式开源了,这对于甲方构建安全工具链来说,绝对是一个大利好
    2021-10-10
  • java实现图片缩放、旋转和马赛克化

    java实现图片缩放、旋转和马赛克化

    这篇文章主要为大家详细介绍了java实现图片缩放、旋转和马赛克化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论