abstract、final、static關鍵字

用於定義類、方法、變量修飾符的關鍵字 abstract、final、static

一、abstract
1、作用
(1)修飾類
抽象類可以被繼承和實現,但是這個類本身不能實例化;
抽象類中可以沒有抽象方法,但類中有抽象方法一定是抽象類
抽象類中可以沒有抽象方法,這樣做的作用是這個類不能被實例化;
抽象類的子類在繼承抽象類後,必須把父類中的抽象方法重寫,否則子類也是抽象類;
(2)修飾方法
抽象方法必須在抽象類中,抽象類中可以有非抽象的方法;
抽象方法用於被子類繼承後重寫,也就是父類的抽象方法是空的,必須由子類繼承之後在子類中由子類實現,這可以達到不同子類可以根據自己的特性來定義自己從父類繼承過來的抽象方法。

2、與其他關鍵字不共存
abstract不能與final關鍵字共存,因爲final關鍵字修飾的類不能被繼承;
abstract不能與private關鍵字共存,因爲私有的東西不能繼承;
abstract不能與static關鍵字共存,當static修飾方法時,該方法可以通過類名直接調用,而abstract修飾的抽象方法沒有實體,是不能被調用的;
abstract修飾 的類中的普通方法可以通過該抽象類的子類直接調用。

3、好處
抽象類的好處:
(1)由於抽象類不能被實例化,最大的好處就是通過方法的覆蓋來實現多態的屬性。也就是運行期綁定
(2) 抽象類將事物的共性的東西取出來,由子類繼承去實現,代碼易擴展、易維護。

二、final
1、作用
(1)修飾類
當final修飾類時,表示該類爲最終類,無法被繼承。
(2)修飾方法
當final修飾方法時,表示該方法將成爲最終方法,無法被子類重寫。但是,該方法仍然可以被繼承。
(3)修飾變量
final修飾的變量在定義時,必須初始化,系統不會默認賦值。
當final修飾一個變量時,則表示該變量已成爲一個不可變常量, 如果嘗試對final變量多次賦值,編譯器將報錯。
(4)修飾引用
一個引用爲引用數據類型,如:對象、數組,則該對象、數組本身可以修改,但是指向該對象或數組的地址的引用不能修改

2、應用場景
(1)若一個方法已經完整了,想要其在子類中不改變,可用 final 關鍵字。
(2)final經常和static一起使用,用來聲明常量。

三、static
1、作用
(1)修飾成員方法
(2)修飾成員變量
(3)修飾代碼塊
靜態代碼塊:
用大括號"{…}"包圍起來的代碼 定義在類中方法外,靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—非靜態代碼塊—構造方法)。如果靜態代碼塊有多
個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次;
(4)修飾內部類
靜態內部類:
它與非靜態內部類之間存在一個最大的區別:非靜態內部類在編譯完成之後會隱含地保存着一個引用,該引用是指向創建它的外圍內,但是靜態內部類卻沒有。沒有這個引用就意味着:
A、它的創建是不需要依賴外圍類的創建
B、它不能使用任何外圍類的非static成員變量和方法
【應用】:靜態內部類實現單例模式

package static_inClass;

//靜態內部類實現單例模式
public class Singleton {
    //聲明爲 private 避免調用默認構造方法創建對象
    private Singleton(){}

    //聲明爲 private 表明靜態內部該類只能在該Singleton 類中被訪問
    private static class SingletonHolder{
        private static final Singleton Instance=new Singleton();
    }
    
    public static Singleton getInstance(){
        return SingletonHolder.Instance;
    }
}
//當Singleton 類被加載時,靜態內部類SingletonHolder沒有被加載進內存。只有當調用
//SingletonHolder.Instance時,SingletonHolder 纔會被加載,此時初始化Instance
實例,並且JVM能確保Instance只被實例化一次。
//這種方式不僅具有延遲初始化的好處,而且由JVM 提供了對線程安全的支持。

(5)static最關鍵作用,就是和對象解綁
1. 靜態屬性-----屬於類,不屬於方法或某個對象
2. 靜態方法-----沒有一個隱式的當前對象引用this

2、訪問權限
(1)在靜態方法中無法使用非靜態的內容,
(2)在靜態方法中,無法訪問普通屬性,無法調用普通方法,無法 使用this 關鍵字

3、屬性(包括靜態屬性)的初始化規則
(1)初始化的方式:
靜態屬性:
1)定義時直接初始化
2)靜態代碼塊初始化
普通屬性:
1) 定義時直接初始化
2) 初始化代碼塊時初始化
3)在構造方法中
(2)初始化的時機:
靜態屬性: 類被加載到內存中時
普通屬性: 對象被實例化時
(3)初始化的順序
1)類的加載一定發生在對象實例化之前靜態屬性的初始化一定 在普通屬性的初始化之前
2)靜態屬性初始化順序,按照定義類時的書寫順序初始化
3)普通屬性初始化順序,定義和構造代碼塊按書寫順序初始化構造方法中的初始化一定發生在最後,和書寫順序無關
4、靜態成員的特點:
(1)在類加載的時候,就進行創建和初始化或執行代碼
(2)它們對於一個類來說,都只有一份,表現出共享的特性
(3)類的所有實例都可以訪問到它們。
(4)靜態成員可直接用類名去訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章