---
# System prepended metadata

title: final
tags: [Java]

---

[toc]

# final
final在不同地方有不同的意思
通常都是禁止一些操作

---

## final local variable
必需對該變數定義初始值, 不得更改數值

```java=
final int a = 1;


// a = 2 // final 變數無法修改

// 不能宣告無初始值的final變數
// final double b;
// final Ship s;

final Point p = new Point(100, 200);
p.setX(200); // 你還是可以呼叫成員方法
// p = new Point(300, 400); // final變數無法修改
```
---

## Final Parameter
該parameter在Method中無法更改.

```java=
public class Main {
    public static void main(String[] args) {
        int i = 1;
        test(i);
    }
    
    public static int test(final int i) {
       i = 3; // not allowed
       System.out.println(i);
    }
}
```

## Final Method
該Method無法被子類別Override

---

## Final class
該class無法被繼承(extend)

---
## Final Field

static:
- 必需對該變數定義初始值, 不得更改數值
  請盡量用全大寫,底線命名

```java
static final int MAX_HEIGHT = 1080;
```

non-static field:
- 初始值可以從constructor提供 但一樣未來無法更改數值
```java=
class Point {
    private final int x;
    private final int y;
 
    public Point() {
        this(-1, -1);
    }
    
    public Point(int x, int x) {
        this.x = x;
        this.y = y;
    }
    
    /*
    public void setX(int x, int y) {
        this.x = x;
        this.y = y;
    }
    */
}

public class Main {
    public static void main(String[] args) {
        Point p2 = new Point(100, 200);
        // p2.y = 300; // now allowed
    }
}
```