当前位置: 移动技术网 > IT编程>开发语言>Java > 举例讲解Java中final关键字的用法

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

2019年07月22日  | 移动技术网IT编程  | 我要评论
1. final variable final variable 就是一个常量,一旦被初始化就不可以被改变。 class test1 { final dou

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的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网