# æ·±å
¥çè§£ finalãfinally å finalize å
³é®å
* [æ·±å
¥çè§£ finalãfinally å finalize å
³é®å](#æ·±å
¥çè§£-finalfinally-å-finalize-å
³é®å)
* [finalãfinally å finalize](#finalfinally-å-finalize)
* [final 修饰类ã屿§åæ¹æ³](#final-ä¿®é¥°ç±»å±æ§åæ¹æ³)
* [finally ä¿è¯ç¨åºä¸å®è¢«æ§è¡](#finally-ä¿è¯ç¨åºä¸å®è¢«æ§è¡)
* [finalize çä½ç¨](#finalize-çä½ç¨)
* [æ·±å
¥çè§£ final ãfinally å finalize](#æ·±å
¥çè§£-final-finally-å-finalize)
* [final 设计](#final-设计)
* [ç©ºç½ final](#空ç½-final)
* [final è½æé«æ§è½åï¼](#final-è½æé«æ§è½å)
* [æ·±å
¥çè§£ finally](#æ·±å
¥çè§£-finally)
* [finally çæ¬è´¨](#finally-çæ¬è´¨)
* [finally ä¸å®ä¼æ§è¡å](#finally-ä¸å®ä¼æ§è¡å)
* [finalize ççæ²¡ç¨å](#finalize-ççæ²¡ç¨å)
`final` æ¯ Java ä¸çå
³é®åï¼å®ä¹æ¯ Java ä¸å¾éè¦çä¸ä¸ªå
³é®åï¼final 修饰çç±»ãæ¹æ³ãåéæä¸åçå«ä¹ï¼`finally` 乿¯ä¸ä¸ªå
³é®åï¼ä¸è¿æä»¬å¯ä»¥ä½¿ç¨ finally åå
¶ä»å
³é®åç»ååä¸äºç»åæä½ï¼ `finalize` æ¯ä¸ä¸ªä¸è®©äººå¾
è§çæ¹æ³ï¼å®æ¯å¯¹è±¡ç¥å® `Object` ä¸çä¸ä¸ªæ¹æ³ï¼finalize æºå¶ç°å¨å·²ç»ä¸æ¨è使ç¨äºãæ¬ç¯æç« ï¼cxuan å°±å¸¦ä½ ä»è¿ä¸ä¸ªå
³é®åå
¥æï¼å¸¦ä½ ä»ç¨æ³ãåºç¨ãåççè§åº¦å¸¦ä½ æ·±å
¥æµ
åºçè§£è¿ä¸ä¸ªå
³é®åã
## finalãfinally å finalize
æç¸ä¿¡å¨åº§çåä½é½æ¯èµæ·±ç¨åºåï¼final è¿ç§åºç¡å
³é®åå°±ä¸ç¨å¤è¯´äºãä¸è¿ï¼è¿æ¯è¦ç
§é¡¾ä¸ä¸å°ç½è¯»è
ï¼æ¯ç«æä»¬é½æ¯ä»å°ç½èµ°è¿æ¥çåã
### final 修饰类ã屿§åæ¹æ³
`final` å¯ä»¥ç¨æ¥ä¿®é¥°ç±»ï¼final 修饰çç±»ä¸å
许å
¶ä»ç±»ç»§æ¿ï¼ä¹å°±æ¯è¯´ï¼final 修饰çç±»æ¯ç¬ä¸æ äºçãå¦ä¸æç¤º

æä»¬é¦å
å®ä¹äºä¸ä¸ª FinalUsage ç±»ï¼å®ä½¿ç¨ final 修饰ï¼åæ¶æä»¬åå®ä¹äºä¸ä¸ª FinalUsageExtend ç±»ï¼å®æ³è¦`ç»§æ¿(extend)` FinalUsageï¼æä»¬å¦ä¸ç»§æ¿åï¼ç¼è¯å¨ä¸è®©æä»¬è¿ä¹ç©å¿ï¼å®æç¤ºæä»¬ **ä¸è½ä» FinalUsage** 类继æ¿ï¼ä¸ºä»ä¹å¢ï¼ä¸ç¨ç®¡ï¼è¿æ¯ Java ç约å®ï¼æä¸äºä¸ºä»ä¹æ²¡æå¿
è¦ï¼éµå®å°±è¡ã
`final` å¯ä»¥ç¨æ¥ä¿®é¥°æ¹æ³ï¼final ä¿®é¥°çæ¹æ³ä¸å
许被éåï¼æä»¬å
æ¼ç¤ºä¸ä¸ä¸ç¨ final å
³é®å修饰çæ
åµ

å¦ä¸å¾æç¤ºï¼æä»¬ä½¿ç¨ FinalUsageExtend 类继æ¿äº FinalUsage ç±»ï¼å¹¶æä¾äº `writeArticle` æ¹æ³çéåãè¿æ ·ç¼è¯æ¯æ²¡æé®é¢çï¼éåçå
³é®ç¹æ¯ `@Override` æ³¨è§£åæ¹æ³ä¿®é¥°ç¬¦ãåç§°ãè¿åå¼çä¸è´æ§ã
>注æï¼å¾å¤ç¨åºåå¨éåæ¹æ³çæ¶åé½ä¼å¿½ç¥ @Overrideï¼è¿æ ·å
¶å®æ çå¢å äºä»£ç é
读çé¾åº¦ï¼ä¸å»ºè®®è¿æ ·ã
å½æä»¬ä½¿ç¨ final ä¿®é¥°æ¹æ³åï¼è¿ä¸ªæ¹æ³åä¸è½è¢«éåï¼å¦ä¸æç¤º

彿们æ writeArticle æ¹æ³å£°æä¸º void åï¼éåçæ¹æ³ä¼æ¥éï¼æ æ³éå writeArticle æ¹æ³ã
`final` å¯ä»¥ä¿®é¥°åéï¼final 修饰çåéä¸ç»å®ä¹åå°±ä¸è½è¢«ä¿®æ¹ï¼å¦ä¸æç¤º

ç¼è¯å¨æç¤ºçéè¯¯æ£æ¯ä¸è½ç»§æ¿ä¸ä¸ªè¢« final 修饰çç±»ã
æä»¬ä¸é¢ä½¿ç¨çæ¯å符串 String ï¼String é»è®¤å°±æ¯ final çï¼å
¶å®ç¨ä¸ç¨ final 修饰æä¹ä¸å¤§ï¼å 为åç¬¦ä¸²æ¬æ¥å°±ä¸è½è¢«æ¹åï¼è¿å¹¶ä¸è½è¯´æé®é¢ã
æä»¬æ¹åä¸ä¸ï¼ä½¿ç¨åºæ¬æ°æ®ç±»åæ¥æ¼ç¤º

åæ ·çå¯ä»¥çå°ï¼ç¼è¯å¨ä»ç¶ç»åºäº age ä¸è½è¢«æ¹åçæç¤ºï¼ç±æ¤å¯ä»¥è¯æï¼final 修饰çåéä¸è½è¢«éåã
å¨ Java ä¸ä¸ä»
ä»
åªæåºæ¬æ°æ®ç±»åï¼è¿æå¼ç¨æ°æ®ç±»åï¼é£ä¹å¼ç¨ç±»å被 final 修饰åä¼å¦ä½å¢ï¼æä»¬çä¸ä¸ä¸é¢ç代ç
é¦å
æé ä¸ä¸ª `Person` ç±»
```java
public class Person {
int id;
String name;
get() and set() ...
toString()...
}
```
ç¶åæä»¬å®ä¹ä¸ä¸ª final ç Person åéã
```java
static final Person person = new Person(25,"cxuan");
public static void main(String[] args) {
System.out.println(person);
person.setId(26);
person.setName("cxuan001");
System.out.println(person);
}
```
è¾åºä¸ä¸ï¼ä½ ä¼åç°ä¸ä¸ªå¥æªçç°è±¡ï¼ä¸ºä»ä¹æä»¬æææ¹äº person ä¸ç id å name ï¼ç¼è¯å¨å´æ²¡ææ¥éå¢ï¼
è¿æ¯å 为ï¼final 修饰çå¼ç¨ç±»åï¼åªæ¯ä¿è¯å¯¹è±¡çå¼ç¨ä¸ä¼æ¹åã对象å
é¨çæ°æ®å¯ä»¥æ¹åãè¿å°±æ¶åå°å¯¹è±¡å¨å
åä¸çåé
é®é¢ï¼æä»¬åé¢å说ã
### finally ä¿è¯ç¨åºä¸å®è¢«æ§è¡
`finally` æ¯ä¿è¯ç¨åºä¸å®æ§è¡çæºå¶ï¼åæ ·çå®ä¹æ¯ Java ä¸çä¸ä¸ªå
³é®åï¼ä¸è¬æ¥è®²ï¼finally ä¸è¬ä¸ä¼åç¬ä½¿ç¨ï¼å®ä¸è¬å try åä¸èµ·ä½¿ç¨ï¼ä¾å¦ä¸é¢æ¯ä¸æ®µ try...finally 代ç å
```java
try{
lock.lock();
}finally {
lock.unlock();
}
```
è¿æ¯ä¸æ®µå é/è§£éç代ç 示ä¾ï¼å¨ lock å éåï¼å¨ finally 䏿§è¡è§£éæä½ï¼å 为 finally è½å¤ä¿è¯ä»£ç ä¸å®è¢«æ§è¡ï¼æä»¥ä¸è¬é½ä¼æä¸äºæ¯è¾éè¦çä»£ç æ¾å¨ finally ä¸ï¼ä¾å¦è§£éæä½ãæµå
³éæä½ãè¿æ¥éæ¾æä½çã
å½ lock.lock() 产çå¼å¸¸æ¶è¿å¯ä»¥å `try...catch...finally` ä¸èµ·ä½¿ç¨
```java
try{
lock.lock();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
```
try...finally è¿ç§åæ³éç¨äº JDK1.7 ä¹åï¼å¨ JDK1.7 ä¸å¼å
¥äºä¸ç§æ°çå
³éæµçæä½ï¼é£å°±æ¯ `try...with...resources`ï¼Java å¼å
¥äº try-with-resources 声æï¼å° try-catch-finally ç®å为 try-catchï¼è¿å
¶å®æ¯ä¸ç§è¯æ³ç³ï¼å¹¶ä¸æ¯å¤äºä¸ç§è¯æ³ãtry...with...resources å¨ç¼è¯æ¶è¿æ¯ä¼è¿è¡è½¬å为 try-catch-finally è¯å¥ã
>`è¯æ³ç³ï¼Syntactic sugarï¼`ï¼ä¹è¯ä¸ºç³è¡£è¯æ³ï¼æ¯æè®¡ç®æºè¯è¨ä¸æ·»å çæç§è¯æ³ï¼è¿ç§è¯æ³å¯¹è¯è¨çåè½å¹¶æ²¡æå½±åï¼ä½æ¯æ´æ¹ä¾¿ç¨åºå使ç¨ãé常æ¥è¯´ä½¿ç¨è¯æ³ç³è½å¤å¢å ç¨åºçå¯è¯»æ§ï¼ä»èåå°ç¨åºä»£ç åºéçæºä¼ã
å¨ Java ä¸ï¼æä¸äºä¸ºäºç®åç¨åºå使ç¨çè¯æ³ç³ï¼å颿æºä¼æä»¬åè°ã
### finalize çä½ç¨
finalize æ¯ç¥å®ç±» `Object`ç±»çä¸ä¸ªæ¹æ³ï¼å®ç设计ç®çæ¯ä¿è¯å¯¹è±¡å¨å徿¶éå宿ç¹å®èµæºçåæ¶ãfinalize ç°å¨å·²ç»ä¸åæ¨è使ç¨ï¼å¨ JDK 1.9 ä¸å·²ç»æç¡®ç被æ 记为 `deprecated`ã
## æ·±å
¥çè§£ final ãfinally å finalize
### final 设计
许å¤ç¼ç¨è¯è¨é½ä¼ææç§æ¹æ³æ¥åç¥ç¼è¯å¨ï¼æä¸åæ°æ®æ¯æå®ä¸åçãææ¶åæå®ä¸åçæ°æ®å¾æç¨ï¼æ¯å¦
* ä¸ä¸ªæ°¸ä¸æ¹åçç¼è¯æå¸¸é ãä¾å¦ **static final int num = 1024**
* ä¸ä¸ªè¿è¡æ¶è¢«åå§åçå¼ï¼èä¸ä½ ä¸å¸ææ¹åå®
final ç设计ä¼å `abstract` ç设计产çå²çªï¼å 为 abstract å
³é®å主è¦ä¿®é¥°`æ½è±¡ç±»`ï¼èæ½è±¡ç±»éè¦è¢«å
·ä½çç±»æå®ç°ãfinal è¡¨ç¤ºç¦æ¢ç»§æ¿ï¼ä¹å°±ä¸ä¼åå¨è¢«å®ç°çé®é¢ãå ä¸ºåªæç»§æ¿åï¼åç±»æå¯ä»¥å®ç°ç¶ç±»çæ¹æ³ã
ç±»ä¸çææ `private` é½éå¼çæå®ä¸º `final` çï¼å¨ private 修饰ç代ç ä¸ä½¿ç¨ final 并没æé¢å¤çæä¹ã
#### ç©ºç½ final
Java æ¯å
许`ç©ºç½ final` çï¼ç©ºç½ final æçæ¯å£°æä¸º final ï¼ä½æ¯å´æ²¡æå¯¹å
¶èµå¼ä½¿å
¶åå§åã使¯æ 论å¦ä½ï¼ç¼è¯å¨é½éè¦åå§å finalï¼æä»¥è¿ä¸ªåå§åçä»»å¡å°±äº¤ç»äº`æé å¨`æ¥å®æï¼ç©ºç½ final ç» final æä¾äºæ´å¤§ççµæ´»æ§ãå¦ä¸ä»£ç
```java
public class FinalTest {
final Integer finalNum;
public FinalTest(){
finalNum = 11;
}
public FinalTest(int num){
finalNum = num;
}
public static void main(String[] args) {
new FinalTest();
new FinalTest(25);
}
}
```
å¨ä¸åçæé å¨ä¸å¯¹ä¸åç final è¿è¡åå§åï¼ä½¿ finalNum çä½¿ç¨æ´å çµæ´»ã
ä½¿ç¨ final çæ¹æ³ä¸»è¦æä¸¤ä¸ªï¼`ä¸å¯å` å `æç`
* ä¸å¯åï¼ä¸å¯åè¯´çæ¯ææ¹æ³éå®ï¼æ³¨æä¸æ¯å éï¼ï¼éå¨é²æ¢å
¶ä»æ¹æ³éåã
* æçï¼è¿ä¸ªä¸»è¦æ¯é对 Java æ©æçæ¬æ¥è¯´çï¼å¨ Java æ©æå®ç°ä¸ï¼å¦æå°æ¹æ³å£°æä¸º final çï¼å°±æ¯åæç¼è¯å¨å°å¯¹æ¤æ¹æ³çè°ç¨æ¹ä¸º`å
åµè°ç¨`ï¼ä½æ¯å´æ²¡æå¸¦æ¥æ¾èçæ§è½ä¼åãè¿ç§è°ç¨å°±æ¯è¾é¸¡èï¼å¨ Java5/6 ä¸ï¼hotspot èææºä¼èªå¨æ¢æµå°å
åµè°ç¨ï¼å¹¶æå®ä»¬ä¼åæï¼æä»¥ä½¿ç¨ final ä¿®é¥°çæ¹æ³å°±ä¸»è¦æä¸ä¸ªï¼ä¸å¯åã
>注æï¼final 䏿¯ Immutable çï¼Immutable ææ¯çæ£çä¸å¯åã
final 䏿¯çæ£ç `Immutable`ï¼å 为 final å
³é®åå¼ç¨ç对象æ¯å¯ä»¥æ¹åçã妿æä»¬ççå¸æå¯¹è±¡ä¸å¯åï¼é常éè¦ç¸åºçç±»æ¯æä¸å¯åè¡ä¸ºï¼æ¯å¦ä¸é¢è¿æ®µä»£ç
```java
final List