java中final修饰符的使用

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修饰的方法时,运行结果如下所示,提示子类没有重写父类的方法。

 

posted @ 2017-07-05 14:05  王甘林  阅读(679)  评论(0编辑  收藏  举报