Java final 关键字示例
Java中的final关键字可以与变量,方法和类一起使用。
final变量:将变量标记为final变量时,我们无法重新分配其值。
final类:如果类是final的,则无法被继承
final方法:我们无法覆盖final方法。
让我们更详细地研究final关键字。
1. final变量
Java提供了两种创建变量并为其赋值的方法。
我们可以声明一个变量并稍后分配值。
我们可以使用赋值运算符在同一条语句中声明变量并赋值。
让我们看看两种情况下最终变量的用法。
package com.theitroad.examples; public class Config { final static String NAME = "CONFIG"; final long initTime; Config() { this.initTime = System.currentTimeMillis(); } public static void main(String[] args) { Config cfg1 = new Config(); System.out.println(cfg1.initTime); Config cfg2 = new Config(); System.out.println(cfg2.initTime); //The final field Config.NAME cannot be assigned // Config.NAME = "config"; //The final field Config.initTime cannot be assigned // cfg1.initTime = 1L; } }
1.1)Java final变量是常量吗?
由于我们无法将新值重新分配给最终变量,因此它们看起来像常量。
但是,这取决于最终变量的类型。
如果最终变量数据类型是不可变的,例如基元和字符串,那么最终变量将保持不变。
如果最终变量数据类型是可变的,则可以调用方法来更改对象状态。
在这种情况下,最终变量不是恒定的,因为可以更改。
让我们用一个简单的例子来理解这一点。
package com.theitroad.examples; public class FinalExamples { //data types are immutable final static int COUNT = 10; final static String NAME = "FinalExamples"; //data types are mutable final static StringBuilder SB = new StringBuilder(); public static void main(String[] args) { SB.append("Hello"); System.out.println(SB.toString()); SB.append("Java"); System.out.println(SB.toString()); } }
1.2)局部 final 变量
在方法内部创建最终变量时,称为局部最终变量。
void foo(int[] ints) { final int x = 10; final boolean flag; flag = true; for (final int i : ints) { System.out.println(i); } }
我们能够在增强的for循环中使用final关键字,因为当for循环迭代完成时,每次都会创建一个新变量。
对于普通的for循环而言,情况并非如此,因此以下代码将引发编译时错误。
//The final local variable j cannot be assigned. //It must be blank and not using a compound assignment for(final int j = 0; j< ints.length; j++) { System.out.println(j); }
2. final类
当一个类声明为final时,我们不能扩展它。
这叫做期末课。
JDK中最后一个类的完美示例是String类。
如果必须创建一个不可变的类,则必须将其标记为最终类。
final class SecureAccess{ } //compile time error //class MoreSecureAccess extends SecureAccess {}
3.final 方法
当一个方法被标记为final方法时,它称为final方法。
最终方法不能在子类中覆盖。
例如,对象类的wait()和notify()方法是最终的,我们不能在实现类中覆盖它们。
最终方法允许重载。
让我们看一下Java中最终方法的示例。
package com.theitroad.examples; public class Base { final void foo(int i) {} //overloading is allowed void foo(int i, String s){} } class Child extends Base{ @Override void foo(int i, String s) {} @Override //void foo(int i) {} }
4.什么时候在Java中使用final关键字?
我们可以使用final关键字定义一些类级别的常量。
当您不希望更改对象时,为它们创建最终变量,例如可用于记录目的的特定于对象的属性。
如果您不希望扩展该类,请将其标记为final。
如果要创建不可变的类,则必须将其设为最终类。
如果您希望所有子类的方法实现都保持不变,则将它们标记为最终方法。