源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-10-31 13:16 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:举例讲解Java中final关键字的用法
[b]1. final variable[/b] 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
[b](1)Blank final variable[/b] 在声明时未初始化的 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
[b](2)Uninitialized static final variable[/b] 在声明阶段未初始化的 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
[b]2. final method[/b] 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
[b]3. final class[/b] 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
[b]PS:java.lang.String类为什么设计成 final 的? [/b]首先,先得清楚 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的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部