【Java】final修飾不同的內容時不同含義以及return和exit的含義——掃盲篇

【Java】final修飾不同的內容時不同含義以及return和exit、dispose的含義——掃盲篇

在最近的學習中碰到了一些細節上的問題,於是看了其他相關的資料,總結出一些關於final修飾符的用法和return、exit在使用的時候應該如何去使用,更好的瞭解他們之間的區別,以便在使用的過程中更加得心應手
final關鍵字可以用來修飾類、方法、變量。各有不同。

final修飾符

A、修飾類(class)。
 1、該類不能被繼承。 
 2、類中的方法不會被重寫,因此默認都是final的。 
 3、用途:設計類時,如果該類不需要有子類,
 不必要被擴展,類的實現細節不允許被改變,那麼就設計成final類
B、修飾方法(method)
 1、該方法可以被繼承,但是不能被重寫。 
 2、用途:一個類不允許子類重寫該方法,則用final來修飾 
 3、好處:可以防止繼承它的子類修改該方法的意義和實現;更為高效,
 編譯器在遇到調用fianal方法轉入內嵌機制,提高了執行效率。 
 4、注意:父類中的private成員方法不能被子類重寫,因此,private方
 法默認是final型的(可以查看編譯後的class文件)
 5.對於使用private修飾的方法,表示私有方法,只能是對象本身調用,
 那麼子類在繼承時是無法訪問該方法的,所以子類無法重寫該方法。
C、修飾變量(variable)
 1、用final修飾後變為常量。包括靜態變量、實例變量和局部變量這三種。 
 2、特點:可以先聲明,不給初值,這種叫做final空白。但是使用前必
 須被初始化。一旦被賦值,將不能再被改變。
 3.a.類Field:必須在靜態初始化塊中或聲明該Field時指定初始值。
 b.實例Field:必須在非靜態初始化塊、聲明該Field或構造器中指定初始值。
 c.局部Field:系統不會對局部變量進行初始化,局部變量必須由程序員顯示
 初始化。因此使用final修飾局部變量時,既可以在定義時指定默認值, 也
 可以不指定默認值。
D、修飾參數(arguments)
 1、用final修飾參數時,可以讀取該參數,但是不能對其作出修改。
E、抽象類(abstract class)
 1、抽象方法(abstract method):不含方法體的方法,它由繼承它子類
 根據需求去實現,必須用abstract修飾。此外,該方法必須對子類可見,
 因此要加只能加public 或者 protected!。 
 2、抽象類:至少包含一個抽象方法的類(可以包含非抽象方法)。
 必須用abstract修飾。 
 3、特點:抽象類不能被實例化(也就是不能new對象);
 含有抽象方法的類必須聲明為抽象類;一個類只有實現了抽象類
 中的所有方法才能被實例化,否則它依然是抽象類。
F、接口(interface)
 1、接口定義:抽象方法和常量值的集合(所有的方法都是抽象方法)。它是一種特殊的抽象類(會生成一個xxx.class文件,編譯器會自動在interface關鍵字前加上abstract)。 
 2、特點: 
    a、接口裏的常量默認都是public static final來修飾的
    (如果什麼都不寫,編譯器會自動幫你寫上)。 
    b、接口裏的方法默認都是public abstract來修飾的(如果是什麼都不寫,
    編譯器會自動幫你寫上)。 
    c、可以用extends繼承已有的接口。 
    d、一個類,可以用implements實現一個或多個接口中的所有
    方法(包括這個接口的父接口中的方法)。 
    e、一個抽象類,可以implements實現接口中的部分方法 
    f、一個類,可以extends一個父類的同時implements多個接口,
    但是extends關鍵字必須在implements關鍵字之前。
補充:

不可變類的意思是創建該類的實例後,該實例的Field是不可改變的。
創建自定義的不可變類,可遵循如下規則:

1. 使用private和final修飾符來修飾該類的Field
2. 提供參數構造器,用於根據傳入參數來初始化類裏的Field
3. 僅為該類的Field提供getter方法。

return和exit

	System.exit(status);這個方法是用來結束當前正在運行中的
	java虛擬機。如何status是非零參數,那麼表示是非正常退出。
	1.	System.exit(0)是將你的整個虛擬機裏的內容都停掉了 ,
	而dispose()只是關閉這個窗口,但是並沒有停止整個
	application exit() 。無論如何,內存都釋放了!也就是
	説連JVM都關閉了,內存里根本不可能還有什麼東西
	2.	System.exit(0)是正常退出程序,而System.exit(1)或者
	説非0表示非正常退出程序
	3.	System.exit(status)不管status為何值都會退出程序。
	和return 相比有以下不同點:return是回到上一層,
	而System.exit(status)是回到最上層
	4.在一個if-else判斷中,如果我們程序是按照我們預
	想的執行,到最後我們需要停止程序,那麼我們使
	用System.exit(0),而System.exit(1)一般放在catch
	塊中,當捕獲到異常,需要停止程序,我們使用
	System.exit(1)。這個status=1是用來表示這個程序是
	非正常退出
正常退出與異常退出有什麼區別?

public static void exit(int status)終止當前正在運行的 Java 虛擬機。參數用作狀態 碼;根據慣例,非 0 的狀態碼錶示異常終止。 該方法調用 Runtime 類中的 exit 方法。該方法永遠不會正常返回。
調用 System.exit(n) 實際上等效於調用:
Runtime.getRuntime().exit(n)
System.exit(0):正常退出
System.exit(1):異常退出
其實他們的效果都是一樣的,程序都會退出,關鍵是退出之後返回的不一樣,看該程序外面怎麼用了,如果不用返回結果的話,其實效果是一樣的

java中的return
return語句作為一個無條件的分支,無需判斷條件即可發生。return語句主要
有兩個用途:一方面用來表示一個方法返回的值(假定沒有void返回值),另一
方面是指它導致該方法退出,並返回那個值。根據方法的定義,每一個方法都
有返回類型,該類型可以是基本類型,也可以是對象類型,同時每個方法都必
須有個結束標誌,因此,return起到了這個作用。在返回類型為void的方法裏
面,有個隱含的return語句,因此,在void方法裏面可以省略不寫。
return和System.exit(0)在trycatch中
	在try或catch中的return語句會將它的返回值壓入棧內,然後執行
	finally語句,當finally執行完成後,若finally語句裏有return語
	句,則執行return語句並結束。若finally沒有return語句,則返回
	被保存的棧裏的return語句,再執行。然而,在壓棧時候,要注意壓入棧
	內的是什麼東西,是值本身還是引用,若是引用則引用的值會改變,若
	是變量值,則不會改變。

結論: 如果try中碰到了return語句,那麼會去執行finally語句,finally中
沒有return語句,執行完finally中的代碼後會執行try的return語句。
如果finally中有return語句的話,則直接使用finally的return返回
值,不再執行try中的return。但是如果try或者catch語句中遇到了
System.exit(0)則finally不會執行,因為整個虛擬機已經退出了。
另,對於方法中的返回值類型需要與try和catch的return值類型對
應,缺一不可。