1. 程式人生 > 實用技巧 >Java基礎之:final關鍵字

Java基礎之:final關鍵字

Java基礎之:final關鍵字

final(最終),final可以修飾類、屬性、方法、區域性變數

在以下情況下用到final:

  1. 不希望類可以被繼承時(最終類):final calss A{}

  2. 不希望屬性可以被改變時:public final int A = 1;

  3. 不希望方法可以被過載\重寫時:public final void show() {}

  4. 不希望區域性變數可以被更改時:final int B = 1;

簡單引用案例

package class_final;
​
/**
 * 
 * 編寫一個程式,能夠計算圓形的面積。要求圓周率為 3.14.  賦值的位置3個方式
 *
 */
public class ClassTest {
​
    public static void main(String[] args) {
        Circle circle = new Circle(5.2,3.1415926);
        System.out.println("area:" + circle.area());
    }
​
}
​
class Circle{
    private double radius;  //半徑
    private final double PI /* = 3.14 */;
    
    public Circle(double radius,double PI) {
        this.radius = radius;
        this.PI = PI;
    } 
    
//  {
//      PI = 3.14;
//  }
    
    public double area() {
        return radius * radius * PI;
    }
}

  

final關鍵字使用細節

  1. final修飾的屬性又叫做常量,一般命名方式是:XX_XX_XX

  2. final屬性在定義時,必須賦初值,可以在以下三個地方賦初值:

    • 定義時,例如:public int TEXT_A = 10;

    • 普通程式碼塊中

    • 構造器中

  3. 如果final修飾的屬性同時被static所修飾時,則就只能在以下兩個地方賦初值:

    • 定義時

    • 靜態程式碼塊中

  4. final類不能繼承但可以例項化物件

  5. 如果類不是final類,但類中有方法是final修飾的,那麼此方法不能重寫,但可以被繼承

  6. 一般來說一個類已經是final類了,那麼就沒有必要再用final修飾類中的方法了

  7. final不能修飾構造器

  8. final 和 static 往往搭配使用,效率更高,底層編譯器做了優化處理。

    • 例如: 包裝類(Integer,Double,Float,Boolean等都是final),String也是final類。

  9. 當final修飾區域性變數,我們稱為區域性常量,可在宣告時賦初值,也可以在它使用前賦值,賦初值不能再修改。

細節案例

package class_final;
​
public class FinalDetail {
    public static void main(String[] args) {
        //細節4:final類不能繼承但可以例項化物件
        new B();
    }
}
​
class A{
    //細節1.final修飾的屬性又叫做常量,一般命名方式是:XX_XX_XX
    //細節2:定義時賦初值
    final int A_INT_X = 1;
    
    //細節2:程式碼塊中賦初值
    final int A_INT_Y ;
    {
        A_INT_Y = 1;
    }
    
    //細節2:構造器中賦初值
    final int A_INT_Z;
    public A() {
        A_INT_Z = 1; 
    }
    
    //細節3:final + static修飾的屬性,在靜態程式碼塊中賦初值
    final static int A_INT_H;
    static {
        A_INT_H = 1 ; 
    }
    
    
    //細節5:如果類不是final類,但類中有方法是final修飾的,那麼此方法不能重寫,但可以被繼承
    public final void m1() {
        System.out.println("A----m1");
    }
}
​
​
final class B{
    
}
​
class C extends A{
    
    public void m2() {
        //細節5:如果類不是final類,但類中有方法是final修飾的,那麼此方法不能重寫,但可以被繼承
        super.m1();
        
        //細節9:當final修飾區域性變數,我們稱為區域性常量,可在宣告時賦初值,也可以在它使用前賦值,賦初值不能再修改。
        final int a;
        
        a = 1;
//      a = 2;  //報錯:The final local variable a may already have been assigned
    }
}