Skip to main content
 首页 » 编程设计

Java 中final修饰符的使用

2022年07月19日51youxin

1.final修饰符的用法:

  • final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值。
  • final可以修饰方法,被final修饰的方法不能被重写。
  • final可以修饰类,被final修饰的类不能够被继承。

  上面的这些“语法口诀”对真正掌握final修饰符的用法依然是不够的。

2.final修饰的变量:被final修饰的实例变量必须显示指定初始值,而且只能在如下三个位置指定初始值:

  • 定义final实例变量时指定初始值。
  • 在非静态初始化块中为final实例变量指定初始值。
  • 在构造方法中为final实例变量指定初始值。

  

package objectStudy; 
 
public class FinalInstanceVaribaleTest { 
    final int var1 = 1;//定义final实例变量时指定初始值。 
    final int var2; 
    final int var3; 
     
    //在非静态初始化块中为final实例变量指定初始值。 
    { 
        var2 = 2; 
    } 
     
    // 在构造方法中为final实例变量指定初始值。 
    public FinalInstanceVaribaleTest() { 
        this.var3 = 3; 
    } 
     
    public static void main(String[] args) { 
        FinalInstanceVaribaleTest finalInstanceVaribaleTest = new FinalInstanceVaribaleTest(); 
        System.out.println(finalInstanceVaribaleTest.var1); 
        System.out.println(finalInstanceVaribaleTest.var2); 
        System.out.println(finalInstanceVaribaleTest.var3); 
    } 
 
}

   经过编译器的处理,上述三种方式都会被抽取到构造器中赋初始值。

  final类变量只能在两个地方指定初始值:

  • 定义final类变量时指定初始值。
  • 在静态初始化块中为final类变量指定初始值。

3.final方法不能被重写

package objectStudy; 
 
class FatherClass { 
    public final void info() { 
        System.out.println("I am father!"); 
    } 
} 
 
class ChildrenClass { 
    @Override//强制重写父类方法 
    public final void info() { 
        System.out.println("I am children!"); 
    } 
} 
 
public class FinalMethodTest { 
     
    public static void main(String[] args) { 
        ChildrenClass childrenClass = new ChildrenClass(); 
        childrenClass.info(); 
    } 
 
}

  上述代码运行结果如下:因为final修饰的类不能够被重写,所以当子类中有和父类中被final修饰的方法名相同的方法是,这只是子类中的一个普通方法,并没有重写父类的方法,但是如果使用@Override注释来强制重写父类中final修饰的方法时,运行结果如下所示,提示子类没有重写父类的方法。


本文参考链接:https://www.cnblogs.com/wgl1995/p/7120998.html