Java之final关键字解析

Java之final关键字解析

final关键字能够修饰不一样的内容,这些内容仅包括一个变量,一个方法或者一个类,如下是final修饰这些内容的做用:java

  • final变量:表示该变量为常量,即只能初始化一次
  • final方法:表示该方法不能被重写
  • final类:表示该类不能够被继承

final变量

当一个变量被final关键字修饰时,意味着它的值不能够被修改了,也就是说,这个变量表示一个常量。这也意味着final变量必须被初始化。若是一个final变量表示的是一个对象的引用,那么该变量就不能从新表示另外一个对象的引用了,可是这个final变量指向的对象的内部状态是能够改变的,例如,咱们能够向一个final array或者final collection中增长或者删除元素。另外,使用大写字母和下划线表示一个final变量是个好习惯。app

Exampleside

// a final variable
final int THRESHOLD = 5;
// a blank final variable
final int THRESHOLD;
// a final static variable PI
static final double PI = 3.141592653589793;
// a  blank final static  variable
static final double PI;

初始化一个final变量函数

咱们必须初始化一个final变量,不然编译器将会抛出错误。一个final变量只能被初始化一次,能够经过初始化器或者初始化语句对其进行初始化。有三种方法能够初始化一个final变量:ui

  1. 在声明final变量时就对齐初始化,这是最经常使用的初始化方式。当一个final变量在声明的时候没有被初始化,这个变量就被成为blank final变量,那么下面的两种方法就是初始化一个blank final变量
  2. blank final变量能够由instance-initializer代码块或者构造函数进行初始化。若是有多个构造函数,那么这个blank final变量必须在每个构造函数中都要进行初始化,不然编译时报错。
  3. 一个blank final static变量能够在内部static代码块中初始化

Examplescode

//初始化final变量的方法
class Test {
    //直接初始化
    final int THRESHOLD = 5;
    //blank final变量
    final int CAPACITY;
    final int MAXMUM;
    //blanck static final变量
    static final int MINIMUM;
    //使用初始化器
    {
        CAPATICY = 25;
    }
    //使用static代码块
    static {
        MAXMUM = 125;
    }
    //使用构造函数
    public Test() {
        MINIMUM = -1;
    }
}

何时须要使用final变量对象

一个普通变量和一个final变量之间惟一的区别就是一旦给final变量赋值,则该变量的值将不能够再被改变。所以,final变量只能用于咱们但愿在整个程序执行过程当中保持不变的值。继承

final变量的值是对象的引用编译器

当一个final变量是一个对象的引用,咱们把这个变量称为引用final变量(reference final variable),例如一个StringBuffer的final变量能够是final StringBuffer sb,咱们知道一个final变量是不能够再从新赋值的,可是这个final变量指向的对象的内部状态是能够改变的,这种final属性能够称为非传递性。it

Examples

class Test
{ 
    public static void main(String[] args) 
    { 
        // a final reference variable sb 
        final StringBuilder sb = new StringBuilder("Test"); 
        System.out.println(sb);     
        // changing internal state of object 
        // reference by final reference variable sb 
        sb.append("ForTest"); 
        System.out.println(sb); 
    }    
}
//输出为:
//Test
//TestForTest

Note

a. final变量不能从新赋值,不然出现编译错误

b. 局部final变量必须在其建立后就对其进行赋值

c. 对比C++的const变量,const变量在声明的时候就须要赋初值,而final变量能够先声明再赋值,但只能赋值一次

d. foreach循环中,final修饰变量是合法的,栗子以下

// Java program to demonstrate final 
// with for-each statement 
class Test 
{ 
    public static void main(String[] args) 
    { 
        int arr[] = {1, 2, 3}; 
        // final with for-each statement 
        // legal statement 
        for (final int i : arr) 
            System.out.print(i + " "); 
    }    
} 
//输出:1 2 3

这里能够这样使用的缘由是每次迭代时至关于从新对i进行了声明

final类

final类没法被继承,有两种使用状况:

  1. 定义一个final类来阻止其余类继承,由于final类是没法被扩展的,好比全部的封装类Integer,Float等都是final类
  2. 另外一种final类是建立一个不可变类,像预约义的String类,若是不使用final关键字咱们是没法建立一个不可变类的

final方法

一个被final修饰的方法是没法被重载的,对于一个含有final方法的父类,在其派生类中该方法必须和父类中的方法保持相同的实现

Example

class A 
{
    final void m1() 
    {
        System.out.println("This is a final method.");
    }
}

class B extends A 
{
    void m1()
    { 
        // COMPILE-ERROR! Can't override.
        System.out.println("Illegal");
    }
}
相关文章
相关标签/搜索