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。
如果要创建不可变的类,则必须将其设为最终类。
如果您希望所有子类的方法实现都保持不变,则将它们标记为最终方法。

