在本教程中,我们将学习final关键字的用法。
final关键字可以与变量,方法和类一起使用。
我们将详细介绍以下主题。
- 1)final变量
- 2)final方法
- 3)final变量
1)final变量
final变量是常量。
初始化后,我们无法更改final变量的值。
让我们看看下面的代码:
class Demo{
final int MAX_VALUE=99;
void myMethod(){
MAX_VALUE=101;
}
public static void main(String args[]){
Demo obj=new Demo();
obj.myMethod();
}
}
Output:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The final field Demo.MAX_VALUE cannot be assigned
at beginnersbook.com.Demo.myMethod(Details.java:6)
at beginnersbook.com.Demo.main(Details.java:10)
我们在上面的程序中遇到了编译错误,因为我们试图修改final变量“MAX_VALUE”的值。
注意:常量名称使用大写被认为是一种好习惯。
空白的final变量
在声明时未初始化的final变量称为空白final变量。
我们必须在类的构造函数中初始化空白的final变量,否则会抛出一个编译错误(错误:变量MAX_VALUE可能尚未初始化)。
这是在类中使用空白final变量的方式:
class Demo{
//空白final变量 未初始化
final int MAX_VALUE;
Demo(){
//必须在构造函数中初始化
MAX_VALUE=100;
}
void myMethod(){
System.out.println(MAX_VALUE);
}
public static void main(String args[]){
Demo obj=new Demo();
obj.myMethod();
}
}
Output:
100
什么是空白的final变量?
假设我们有一个Student类,其中有一个名为Roll_No的成员变量。
由于Roll_No不应该在学生注册后更改,我们可以将其声明为类中的final变量。
但我们无法提前初始化ROLL_NO学生们(否则所有学生都会有相同的卷号)。
在这种情况下,我们可以声明ROLL_NO变量为空白final,我们在对象构造期间初始化此值,如下所示:
class StudentData{
//Blank final variable
final int ROLL_NO;
StudentData(int rnum){
//必须构造函数中初始化
ROLL_NO=rnum;
}
void myMethod(){
System.out.println("Roll no is:"+ROLL_NO);
}
public static void main(String args[]){
StudentData obj=new StudentData(1234);
obj.myMethod();
}
}
Output:
Roll no is:1234
未初始化的静态final变量
声明期间未初始化的静态final变量只能在静态块中初始化。例:
class Example{
//static 未初始化final变量
static final int ROLL_NO;
static{
ROLL_NO=1230;
}
public static void main(String args[]){
System.out.println(Example.ROLL_NO);
}
}
Output:
1230
2)final方法
无法覆盖final方法。
这意味着即使子类虽然调用父类的final方法没有任何问题,但是不能覆盖它。
例:
class XYZ{
final void demo(){
System.out.println("XYZ Class Method");
}
}
class ABC extends XYZ{
void demo(){
System.out.println("ABC Class Method");
}
public static void main(String args[]){
ABC obj= new ABC();
obj.demo();
}
}
上面的程序会抛出一个编译错误,但是我们可以在子类中使用父类final方法而不会出现任何问题。
让我们来看看这段代码:这个程序运行正常,因为我们没有覆盖final方法。
这表明final方法是可以继承下来的,但它们不符合覆盖的条件。
class XYZ{
final void demo(){
System.out.println("XYZ Class Method");
}
}
class ABC extends XYZ{
public static void main(String args[]){
ABC obj= new ABC();
obj.demo();
}
}
Output:
XYZ Class Method
3) final class
不能继承一个final类.
如下示例:
final class XYZ{
}
class ABC extends XYZ{
void demo(){
System.out.println("My Method");
}
public static void main(String args[]){
ABC obj= new ABC();
obj.demo();
}
}
Output:
The type ABC cannot subclass the final class XYZ
要点总结
- 1)构造函数不能被声明为final。
- 2)本地final变量必须在声明期间初始化。
- 3)在接口中声明的所有变量默认为final。
- 4)我们不能改变final变量的值。
- 5)不能覆盖final方法。
- 6)final类不得继承。
- 7)如果方法参数被声明为final,则不能更改这些参数的值。
- 8)在大写命名final变量是一个好习惯。
- 9)final, finally 和 finalize确定是三个不同的术语。finally用于异常处理,finalize是JVM在调用期间调用的方法垃圾收集。
原文地址:
https://beginnersbook.com/2014/07/final-keyword-java-final-variable-method-class/