举例讲解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中final关键字的用法总结
-
Java多线程编程中synchronized关键字的基础用法讲解
-
举例讲解Java中final关键字的用法
-
Java中synchronized关键字修饰方法同步的用法详解
-
小议Java中final关键字使用时的注意点
-
JAVA基础----java中final和static关键字的理解 博客分类: JAVA基础 javastaticfinal关键字
-
浅谈Java中的final关键字与C#中的const, readonly关键字
-
举例讲解Java设计模式编程中Decorator装饰者模式的运用
-
举例讲解Java设计模式编程中模板方法模式的运用实例
-
举例讲解Java的Spring框架中AOP程序设计方式的使用