# æ·±å
¥çè§£ 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
左边æ¯é final å
³é®å修饰ç代ç ï¼å³è¾¹æ¯æ final å
³é®å修饰ç代ç ï¼å¯¹æ¯è¿ä¸¤ä¸ªåèç ï¼å¯ä»¥å¾åºå¦ä¸ç»è®ºã
* ä¸ç®¡ææ²¡æ final 修饰 ï¼int a = 11 æè
int a = 12 é½å½ä½å¸¸éçå¾
ã
* å¨ return è¿åå¤ï¼ä¸å final ç a + b ä¼å½ä½å鿥å¤çï¼å final 修饰ç a + b ä¼ç´æ¥å½ä½å¸¸éå¤çã
> å
¶å®è¿ç§å±é¢ä¸çå·®å¼åªå¯¹æ¯è¾ç®æç JVM å½±åè¾å¤§ï¼å ä¸ºè¿æ ·ç VM 对解éå¨çä¾èµè¾å¤§ï¼åæ¬ Class æä»¶éçåèç æ¯ææ ·çå®å°±æä¹æ§è¡ï¼å¯¹é«æ§è½ç JVMï¼ä¾å¦ HotSpotãJ9 çï¼å没å¥å½±åã
æä»¥ï¼å¤§é¨å final 对æ§è½ä¼åçå½±åï¼å¯ä»¥ç´æ¥å¿½ç¥ï¼æä»¬ä½¿ç¨ final æ´å¤çèéå¨äºå
¶ä¸å¯åæ§ã
### æ·±å
¥çè§£ finally
æä»¬ä¸é¢å¤§è´èå°äº finally ç使ç¨ï¼å
¶ä½ç¨å°±æ¯ä¿è¯å¨ try åä¸çä»£ç æ§è¡å®æä¹åï¼å¿
ç¶ä¼æ§è¡ finally ä¸çè¯å¥ãä¸ç®¡ try å䏿¯å¦æåºå¼å¸¸ã
é£ä¹ä¸é¢æä»¬å°±æ¥æ·±å
¥è®¤è¯ä¸ä¸ finally ï¼ä»¥å finally çåèç æ¯ä»ä¹ï¼ä»¥å finally ç©¶ç«ä½æ¶æ§è¡çæ¬è´¨ã
* **é¦å
æä»¬ç¥é finally ååªä¼å¨ try åæ§è¡çæ
åµä¸ææ§è¡ï¼finally ä¸ä¼åç¬åå¨**ã
è¿ä¸ªä¸ç¨åè¿å¤è§£éï¼è¿æ¯å¤§å®¶é½ç¥éç䏿¡è§åãfinally å¿
é¡»å try åæè
try catch åä¸èµ·ä½¿ç¨ã
* **å
¶æ¬¡ï¼finally åå¨ç¦»å¼ try åæ§è¡å®æåæè
try åæªæ§è¡å®æä½æ¯æ¥ä¸æ¥æ¯æ§å¶è½¬ç§»è¯å¥æ¶ï¼return/continue/breakï¼å¨æ§å¶è½¬ç§»è¯å¥ä¹åæ§è¡**
è¿ä¸æ¡å
¶å®æ¯è¯´æ finally çæ§è¡æ¶æºçï¼æä»¬ä»¥ return ä¸ºä¾æ¥çä¸ä¸æ¯ä¸æ¯è¿ä¹åäºã
å¦ä¸è¿æ®µä»£ç
```java
static int mayThrowException(){
try{
return 1;
}finally {
System.out.println("finally");
}
}
public static void main(String[] args) {
System.out.println(FinallyTest.mayThrowException());
}
```
仿§è¡ç»æå¯ä»¥è¯ææ¯ finally è¦å
äº return æ§è¡çã
å½ finally æè¿å弿¶ï¼ä¼ç´æ¥è¿åãä¸ä¼åå»è¿å try æè
catch ä¸çè¿åå¼ã
```java
static int mayThrowException(){
try{
return 1;
}finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(FinallyTest.mayThrowException());
}
```
* **卿§è¡ finally è¯å¥ä¹åï¼æ§å¶è½¬ç§»è¯å¥ä¼å°è¿åå¼å卿¬å°åéä¸**
çä¸é¢è¿æ®µä»£ç
```java
static int mayThrowException(){
int i = 100;
try {
return i;
}finally {
++i;
}
}
public static void main(String[] args) {
System.out.println(FinallyTest.mayThrowException());
}
```
ä¸é¢è¿æ®µä»£ç è½å¤è¯´æ return i æ¯å
äº ++i æ§è¡çï¼èä¸ return i 伿 i ç弿åï¼å finally ä¸èµ·è¿åã
#### finally çæ¬è´¨
ä¸é¢æä»¬æ¥ç䏿®µä»£ç
```java
public static void main(String[] args) {
int a1 = 0;
try {
a1 = 1;
}catch (Exception e){
a1 = 2;
}finally {
a1 = 3;
}
System.out.println(a1);
}
```
è¿æ®µä»£ç è¾åºçç»ææ¯ä»ä¹å¢ï¼çæ¡æ¯ 3ï¼ä¸ºå¥å¢ï¼
æ±ççé®ï¼æä»¬å
æ¥çä¸ä¸è¿æ®µä»£ç çåèç
åèç çä¸ææ³¨éæå·²ç»ç»ä½ æ åºæ¥äºï¼è¿ééè¦æ³¨æä¸ä¸ä¸é¢ç `Exception table`ï¼Exception table æ¯å¼å¸¸è¡¨ï¼å¼å¸¸è¡¨ä¸æ¯ä¸ä¸ªæ¡ç®ä»£è¡¨ä¸ä¸ªå¼å¸¸åçå¨ï¼å¼å¸¸åçå¨ç± From æéï¼To æéï¼Target æéååºè¯¥æè·çå¼å¸¸ç±»åææã
æä»¥ä¸é¢è¿æ®µä»£ç çæ§è¡è·¯å¾æä¸ç§
* 妿 try è¯å¥åä¸åºç°äºå±äº exception åå
¶åç±»çå¼å¸¸ï¼åè·³è½¬å° catch å¤ç
* 妿 try è¯å¥åä¸åºç°äºä¸å±äº exception åå
¶åç±»çå¼å¸¸ï¼åè·³è½¬å° finally å¤ç
* 妿 catch è¯å¥å䏿°åºç°äºå¼å¸¸ï¼åè·³è½¬å° finally å¤ç
èå°è¿éï¼æä»¬è¿æ²¡è¯´ finally çæ¬è´¨å°åºæ¯ä»ä¹ï¼ä»ç»è§å¯ä¸ä¸ä¸é¢çåèç ï¼ä½ ä¼åç°å
¶å® finally 伿 `a1 = 3` çåèç **iconst_3 å istore_1** æ¾å¨ try åå catch åçåé¢ï¼æä»¥ä¸é¢è¿æ®µä»£ç 就形åäº
```java
public static void main(String[] args) {
int a1 = 0;
try {
a1 = 1;
// finally a1 = 3
}catch (Exception e){
a1 = 2;
// finally a1 = 3
}finally {
a1 = 3;
}
System.out.println(a1);
}
```
ä¸é¢ä¸ç Exception table æ¯åªæ `Throwable` çåç±» **exception å error** æä¼æ§è¡å¼å¸¸èµ°æ¥çå¼å¸¸è¡¨ï¼æ£å¸¸æ
åµä¸æ²¡æ try åæ¯æ²¡æå¼å¸¸è¡¨çï¼ä¸é¢æ¥éªè¯ä¸ä¸
```java
public static void main(String[] args) {
int a1 = 1;
System.out.println(a1);
}
```
æ¯å¦ä¸é¢æä»¬ä½¿ç¨äºä¸æ®µé常ç®åçç¨åºæ¥éªè¯ï¼ç¼è¯åæä»¬æ¥çä¸ä¸å®çåèç
å¯ä»¥çå°ï¼æç¶æ²¡æå¼å¸¸è¡¨çåå¨ã
#### finally ä¸å®ä¼æ§è¡å
ä¸é¢æä»¬è®¨è®ºç齿¯ finally ä¸å®ä¼æ§è¡çæ
åµï¼é£ä¹ finally ä¸å®ä¼è¢«æ§è¡åï¼ææä¸æ¯ã
é¤äºæºæ¿æçµãæºæ¿çç¸ãæºæ¿è¿æ°´ãæºæ¿è¢«é·åã强å¶å
³æºãæçµæºä¹å¤ï¼è¿æå ç§æ
åµè½å¤ä½¿ finally ä¸ä¼æ§è¡ã
* è°ç¨ `System.exit` æ¹æ³
* è°ç¨ `Runtime.getRuntime().halt(exitStatus)` æ¹æ³
* JVM 宿º(æç¬è¸)
* 妿 JVM å¨ try æ catch åä¸è¾¾å°äºæ é循ç¯ï¼æå
¶ä»ä¸é´æï¼ä¸ç»æ¢çè¯å¥ï¼
* æä½ç³»ç»æ¯å¦å¼ºè¡ç»æ¢äº JVM è¿ç¨ï¼ä¾å¦ï¼å¨ UNIX 䏿§è¡ kill -9 pid
* 妿䏻æºç³»ç»æ»æºï¼ä¾å¦çµæºæ
éï¼ç¡¬ä»¶éè¯¯ï¼æä½ç³»ç»æ»æºçä¸ä¼æ§è¡
* 妿 finally åç±å®æ¤ç¨åºçº¿ç¨æ§è¡ï¼é£ä¹ææé宿¤çº¿ç¨å¨ finally è°ç¨ä¹åéåºã
### finalize ççæ²¡ç¨å
æä»¬ä¸é¢ç®åä»ç»äºä¸ä¸ finalize æ¹æ³ï¼å¹¶è¯´æäºå®æ¯ä¸ç§ä¸å¥½çå®è·µãé£ä¹ finalize è°ç¨çæ¶æºæ¯ä»ä¹ï¼ä¸ºä»ä¹è¯´ finalize 没ç¨å¢ï¼
æä»¬ç¥éï¼Java ä¸ C++ ä¸ä¸ªæ¾èçåºå«å¨äº Java è½å¤`èªå¨ç®¡çå
å`ï¼å¨ Java ä¸ï¼ç±äº GC çèªå¨åæ¶æºå¶ï¼å èå¹¶ä¸è½ä¿è¯ `finalize` æ¹æ³ä¼è¢«åæ¶å°æ§è¡ï¼åå¾å¯¹è±¡çåæ¶æ¶æºå
·æä¸ç¡®å®æ§ï¼ï¼ä¹ä¸è½ä¿è¯å®ä»¬ä¼è¢«æ§è¡ã
>ä¹å°±æ¯è¯´ï¼finalize çæ§è¡æ¶æä¸ç¡®å®ï¼æä»¬å¹¶ä¸è½ä¾èµäº finalize æ¹æ³å¸®æä»¬è¿è¡åå¾åæ¶ï¼å¯è½åºç°çæ
嵿¯å¨æä»¬èå°½èµæºä¹åï¼gc å´ä»æªè§¦åï¼æä»¥æ¨è使ç¨èµæºç¨å®å³æ¾ç¤ºéæ¾çæ¹å¼ï¼æ¯å¦ close æ¹æ³ã餿¤ä¹å¤ï¼finalize æ¹æ³ä¹ä¼çåå¼å¸¸ã
finalize ç工使¹å¼æ¯è¿æ ·çï¼ä¸æ¦åå¾åæ¶å¨åå¤å¥½éæ¾å¯¹è±¡å ç¨çåå¨ç©ºé´ï¼å°ä¼é¦å
è°ç¨ `finalize` æ¹æ³ï¼å¹¶ä¸å¨ä¸ä¸æ¬¡åå¾åæ¶å¨ä½åçæ¶ï¼æä¼çæ£åæ¶å¯¹è±¡å ç¨çå
åã**åå¾åæ¶åªä¸å
åæå
³**ã
æä»¬å¨æ¥å¸¸å¼åä¸å¹¶ä¸æå¡ä½¿ç¨ finalize æ¹æ³ï¼è½ç¨ finalize æ¹æ³çå°æ¹ï¼ä½¿ç¨ try...finally ä¼å¤ççæ´å¥½ã

