Java教程35—Java中的final关键字用法

在本教程中,我们将学习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/

猜你喜欢

转载自blog.csdn.net/y396397735/article/details/82751026