Java最終關鍵字



Java的

Java final關鍵字是一個不可訪問的修飾符,它對用戶幾乎沒有限制。 換句話說,當我們使用關鍵字 最後, 我們無法重新分配或重新初始化它們。 這意味著我們無法更改值。 在本教程中,我們將學習如何在各種情況下使用final關鍵字。

Java final關鍵字的使用

在以下情況下,我們可以使用java final關鍵字:

  • 變量
  • 方法
  • 課程
  • 參數

Java final關鍵字

Java最終變量

當我們在java中的變量之前使用final關鍵字時,我們將其稱為final變量。 將值分配給最終變量後,我們將無法更改值或重新分配新值。 通常,我們使用java final 變量 作為常量。 最好總是使用大寫字母來命名最終變量。

讓我們看下面的例子。 我們知道pi的值始終是常數,沒有其他任何值。 在這種情況下,我們可以將PI變量聲明為final。

public class Circle {

  final double PI = 3.14;
  
  public void area(int r) {
    double area = PI*r*r;
    System.out.println("Area of circle: " + area);
  }
  public static void main(String[] args) {
    Circle c = new Circle();
    c.area(4);

  }

}
Area of circle: 50.24

如果我們嘗試修改PI值,它將引發編譯錯誤。

public class Circle {

  final double PI= 3.14;
  
  public void area(int r) {
    PI= 2.14;
    double area = PI*r*r;
    System.out.println("Area of circle: " + area);
  }
  public static void main(String[] args) {
    Circle c = new Circle();
    c.area(4);

  }

}
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  The final field Circle.PI cannot be assigned

  at Circle.area(Circle.java:6)
  at Circle.main(Circle.java:12)

空白最終變量

如果在聲明過程中沒有為最終變量賦值,則在Java中將其稱為空白最終變量。 如果我們在聲明過程中不初始化最終變量,那麼我們只能在構造函數中做同樣的事情,否則會得到編譯錯誤。 我們無法在任何其他方法中初始化最終變量。

public class Circle {

  final double PI;
  
       //Initialize final variable in the constructor
  Circle() {
    PI= 3.14;
  }
  
  public void area(int r) {
    double area = PI*r*r;
    System.out.println("Area of circle: " + area);
  }
  public static void main(String[] args) {
    Circle c = new Circle();
    c.area(4);

  }

}
Area of circle: 50.24

現在,為什麼我們需要在Java中有一個空白的final變量? 答案是每次初始化時我們都需要為最終變量使用不同的值,那麼我們可以使用空白的最終變量。 例如,當我們創建一個Employee類時,每個僱員都有一個不同的僱員ID。 因此,我們無法在聲明期間初始化最終變量。 每次創建僱員對象時,我們都可以傳遞在構造函數中初始化的empid的值。

public class Employee {
  final int empid;
  String empname;
  
  Employee(int id) {
    empid = id;
  }
  
  public void setName(String name) {
    this.empname = name; 
  }
  public static void main(String[] args) {
    Employee e = new Employee(4321);
    Employee e1 = new Employee(1121);
    e.setName("Ravi");
    e1.setName("Kiran");
    System.out.println("Employee ID: " + e.empid);
    System.out.println("Employee name: " + e.empname);
    System.out.println("Employee ID: " + e1.empid);
    System.out.println("Employee name: " + e1.empname);
  }

}
Employee ID: 4321
Employee name: Ravi
Employee ID: 1121
Employee name: Kiran

靜態最終變量

我們可以將最終變量聲明為 靜止 在Java中也是如此。 在這種情況下,如果我們在聲明期間未初始化,則只能在static塊中初始化static final變量。 我們也不能在構造函數中進行初始化,因為它是靜態的final變量。 否則,它將引發編譯錯誤。

public class StaticFinalExample {
  static final int VALUE;
  
  static {
    VALUE = 100;
  }
  
  public void display() {
    System.out.println("Value is : " + VALUE);
  }

  public static void main(String[] args) {
    StaticFinalExample s = new StaticFinalExample();
    s.display();

  }

}
Value is : 100

Java最終方法

當我們在之前使用java final關鍵字時 方法,我們稱其為最終方法。 在這種情況下,我們無法覆蓋最終方法。 要了解這一點,您需要了解 Java中的繼承Java中的多態性。 當父類和子類中都有相同的方法時,我們將其稱為方法重寫。

我們可以直接從子類調用final方法,但是我們不能覆蓋它,因為它將導致編譯錯誤。

在下面的示例中,當我們嘗試覆蓋子類中的final方法時,我們收到了編譯錯誤

class Vehicle {
  final void speed() {
    System.out.println("Default speed");
  }
}
public class Car extends Vehicle{

  void speed() {
    System.out.println("Car speed");
  }
  public static void main(String[] args) {

  }

}
Error: LinkageError occurred while loading main class Car
  java.lang.VerifyError: class Car overrides final method Vehicle.speed()V

但是,我們可以直接調用父類的final方法,如下所示。

class Vehicle {
  final void speed() {
    System.out.println("Default speed");
  }
}
public class Car extends Vehicle{

  public static void main(String[] args) {
    Car c = new Car();
    c.speed();

  }

}
Default speed

Java最終課程

當我們在Java中創建類時使用final關鍵字時,我們將其稱為final類。 我們不能擴展最終類,也不支持繼承。 大多數Java核心庫都有一個最終類,例如 例如類。

final class Vehicle {
  public void speed() {
    System.out.println("Default speed");
  }
}
public class Car extends Vehicle{

  public static void main(String[] args) {
    
  }

}
The type Car cannot subclass the final class Vehicle

但是,我們可以使用final類的方法,但是我們不能對其進行擴展。 最終課程的主要目的是我們不能繼承該最終課程的功能。 在這種情況下,當我們不希望任何類繼承類時,可以將其聲明為最終類。

final public class Vehicle {
  public void speed() {
    System.out.println("Default speed");
  }
  
  public static void main(String[] args) {
    Vehicle v = new Vehicle();
    v.speed();
  }
}

Default speed

Java最終參數

我們還可以使用java final關鍵字作為參數。 在這種情況下,我們無法更改作為參數傳遞的最終變量的值。 我們可以直接訪問變量。

public class Vehicle {
  public void speed(final int sp) {
    System.out.println("Default speed is " + sp);
  }
  
  public static void main(String[] args) {
    Vehicle v = new Vehicle();
    v.speed(20);
  }
}

Default speed is 20

如果嘗試更改該值,將出現如下編譯錯誤。

public class Vehicle {
  public void speed(final int sp) {
    sp = 5;
    System.out.println("Default speed is " + sp);
  }
  
  public static void main(String[] args) {
    Vehicle v = new Vehicle();
    v.speed(20);
  }
}

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  The final local variable sp cannot be assigned. It must be blank and not using a compound assignment

  at Vehicle.speed(Vehicle.java:3)
  at Vehicle.main(Vehicle.java:9)

Java最終參考變量

我們還可以在Java中將final關鍵字與參考變量一起使用。 這樣做時,我們無法為相同的參考變量創建另一個實例

例如,在下面的代碼中,我們已將引用變量v聲明為final。 在這種情況下,當我們嘗試為該變量重新分配另一個參考變量時,將收到編譯錯誤。

public class Vehicle {
  public void speed(int sp) {
    System.out.println("Default speed is " + sp);
  }
  
  public static void main(String[] args) {
    final Vehicle v = new Vehicle();
    v.speed(20);
    Vehicle v2 = new Vehicle();
    v = v2;
  }
}

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  The final local variable v cannot be assigned. It must be blank and not using a compound assignment

  at Vehicle.main(Vehicle.java:10)

但是,我們可以使用此引用變量訪問方法。

public class Vehicle {
  public void speed(int sp) {
    System.out.println("Default speed is " + sp);
  }
  
  public static void main(String[] args) {
    final Vehicle v = new Vehicle();
    v.speed(20);
    
  }
}

Default speed is 20

Java final關鍵字的功能

  • 我們必須在聲明期間初始化最終變量,否則我們只能在構造函數中初始化。
  • Java的 不支持構造函數的final關鍵字.
  • 最終變量值不能更改。
  • 我們不能從最終課程繼承。
  • Java不允許覆蓋最終方法
  • 最佳做法是以CAPITAL字母命名最終變量。
  • 默認情況下,接口內的所有變量都是最終變量。

參考文獻