# Java 中的最终关键字 - 最终变量，方法和类

> 原文： [https://beginnersbook.com/2014/07/final-keyword-java-final-variable-method-class/](https://beginnersbook.com/2014/07/final-keyword-java-final-variable-method-class/)

在本教程中，我们将学习 final 关键字的用法。 final 关键字可以与变量，方法和类一起使用。我们将详细介绍以下主题。

1）最终变量
2）最终方法
3）最终类

## 1）最终变量

最终变量只不过是常数。初始化后，我们无法更改最终变量的值。让我们看看下面的代码：

```java
class Demo{  

   final int MAX_VALUE=99;
   void myMethod(){  
      MAX_VALUE=101;
   }  
   public static void main(String args[]){  
      Demo obj=new  Demo();  
      obj.myMethod();  
   }  
}
```

**输出：**

```java
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)
```

我们在上面的程序中遇到了编译错误，因为我们试图更改最终变量“MAX_VALUE”的值。

注意：在大写（CAPS）中使用常量名称被认为是一种好习惯。

### 空白的最终变量

在声明时未初始化的最终变量称为**空白最终变量**。我们**必须在类的构造函数**中初始化空白的最终变量，否则会抛出编译错误（错误：变量 MAX_VALUE 可能尚未初始化）。

这是在类中使用空白最终变量的方式：

```java
class Demo{  
   //Blank final variable
   final int MAX_VALUE;

   Demo(){
      //It must be initialized in constructor
      MAX_VALUE=100;
   }
   void myMethod(){  
      System.out.println(MAX_VALUE);
   }  
   public static void main(String args[]){  
      Demo obj=new  Demo();  
      obj.myMethod();  
   }  
}
```

**Output:**

```java
100
```

**什么是空白的最终变量？**
假设我们有一个 Student 类，其中有一个名为 Roll No.的字段。由于 Roll No 不应该在学生注册后更改，我们可以将其声明为类中的最终变量但我们无法初始化没有提前为所有学生滚动（否则所有学生都会有相同的卷号）。在这种情况下，我们可以声明 roll 无变量为空白 final，我们在对象创建期间初始化此值，如下所示：

```java
class StudentData{  
   //Blank final variable
   final int ROLL_NO;

   StudentData(int rnum){
      //It must be initialized in constructor
      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:**

```java
Roll no is:1234
```

更多关于 [StackOverflow](https://stackoverflow.com/questions/11345061/why-must-a-final-variable-be-initialized-before-constructor-completes) 和 [Wiki](https://en.wikipedia.org/wiki/Final_%28Java%29#Blank_final) 的空白最终变量。

### 未初始化的静态最终变量

声明期间未初始化的静态最终变量只能在[静态块](https://beginnersbook.com/2013/04/java-static-class-block-methods-variables/ "Java – Static Class, Block, Methods and Variables")中初始化。例：

```java
class Example{  
   //static blank final variable  
   static final int ROLL_NO;
   static{ 
      ROLL_NO=1230;
   }  
   public static void main(String args[]){  
      System.out.println(Example.ROLL_NO);  
   }  
}
```

**Output:**

```java
1230
```

## 2）最终方法

最终方法无法覆盖。这意味着即使子类可以调用父类的最终方法而没有任何问题，但它不能覆盖它。

例：

```java
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 方法而不会出现任何问题。让我们来看看这段代码：这个程序运行正常，因为我们不是[覆盖](https://beginnersbook.com/2014/01/method-overriding-in-java-with-example/ "Method overriding in java with example")的最终方法。这表明最终方法是[继承](https://beginnersbook.com/2013/05/java-inheritance-types/ "Types of inheritance in Java: Single,Multiple,Multilevel & Hybrid")，但它们不符合覆盖的条件。

```java
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:**

```java
XYZ Class Method
```

## 3）最后一堂课

我们不能延长最后一堂课。考虑以下示例：

```java
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:**

```java
The type ABC cannot subclass the final class XYZ
```

**要记住的要点：**
1）[构造函数](https://beginnersbook.com/2013/03/constructors-in-java/ "Constructors in Java – A complete study!!")不能被声明为 final。
2）本地最终变量必须在声明期间初始化。
3）[接口](https://beginnersbook.com/2013/05/java-interface/ "Interface in java with example programs")中声明的所有变量默认为 final。
4）我们无法改变最终变量的值。
5）最终方法不能被覆盖。
6）最后一堂课不被继承。
7）如果方法参数被声明为 final，则不能更改这些参数的值。
8）在所有 CAPS 中命名最终变量是一个好习惯。
9）最终，[终于](https://beginnersbook.com/2013/04/java-finally-block/ "Java Finally block – Exception handling")并最终确定了三个不同的术语。 finally 用于异常处理，finalize 是在[垃圾收集](https://beginnersbook.com/2013/04/java-garbage-collection/ "What is Garbage Collection in Java?")期间由 JVM 调用的方法。