封裝:
- 封裝:將對象狀態信息隱藏在對象內部,不允許外部程序直接訪問對象內部信息,而是用類所提供的方法訪問和操作。
- 訪問控制符:private(當前類訪問權) ,protected(子類訪問),public(公共訪問),default(包訪問)
- set(),get()
- 構造器重載,名字相同 ,形參不同。
- 構造器中調用另一個構造器用this();必須出現在構造器第一行。
- 方法重載:名字相同,形參不同。與返回值,修飾符無關。
繼承:
- 繼承:每個子類只有一個直接父類,extends。
- 默認繼承java.lang.Object,是所有類的父類。
- 子類可以重寫父類方法。方法重寫。兩同兩小一大:方法名同,形參同,返回值小,異常小,子類訪問權限大。
- 子類覆蓋后子類對象不可調用父類方法,但可在子類方法中調用,super(實例方法),父類類名(類方法)來調用。
- 如果父類private,那方法對子類隱藏,子類無法調用,無法重寫。
- super:也可用來訪問父類被覆蓋的實例變量。
- 會為所有實例變量分配內存。(被覆蓋了也分配)
- 子類也可以用super調用父類構造器。
- 子類沒有super調用父類構造器,系統會在執行子類構造器之前調用父類構造器。
- 父類構造器在子類構造器之前進行,還會上溯,最先執行的總是java.lang.Object構造器。
繼承注意點:子類可以訪問父類成員變量和方法,不安全
- 盡量隱藏父類內部數據,private
- 不讓子類隨便訪問,修改父類方法,不能訪問private.如果希望訪問不讓重寫,用final public,可以被子類重寫不能被外部訪問用protected.
- 盡量不在父類構造器中調用被子類重寫的方法。
多態:編譯時類型和運行時類型不同,相同類型的變量調用同一個方法呈現多種不同行為特征。
- 編譯時類型:聲明該變量時的類型。
- 運行時類型:實際賦給該變量的對象。
- 子類對象賦給父類引用變量——向上轉型,系統自動完成。
- 父類對象賦給子類引用變量——強制類型轉換,instanceof判斷更安全,否則ClassCastException
- 最終類不能被繼承:1.用final修飾類,2.用private修飾類的所有構造器,子類無法調用,就無法繼承。
- 組合復用。
初始化塊:
- 可有修飾符static。初始化塊按順序進行。
- 創建對象時,先調用類里的初始化塊再執行構造器。
- 初始化塊是構造器補充,在構造器前執行。
- 但是不能接受任何參數,對所有對象初始化相同。
?
?
- ==和equals:引用變量用==時,只有他們指向同一個對象才true。==兩邊沒有父子關系的兩個對象會編譯錯誤。
- “hello”直接量存在常量池,new String ("hello")Jvm會用常量池保存"hello",在調用String類構造器創建一個新對象,保存在堆內存中。所以不相等。
- 值相等用str1.equals(str2);
?
?
- 類成員,類方法,即使實例是Null也可以訪問類成員,null訪問實例成員會引發NullPointerException。
- 靜態初始化塊也是類成員,類初始化時調用,之后不再執行,
- 類成員不能訪問實例變量。
?
- 單例類:一個類只能創建一個實例。構造器private。提供一個public 方法作為訪問點,用于創建對象,且是public static.且類還必須緩存已經創建的對象。用一個成員變量來保存曾創建的對象,要被靜態方法訪問,必須也static.
- 只能創建一個對象,再多引用所指的都相等。
- final:
- 修飾變量,該變量一旦有初始值就不可改變,final修飾的成員變量必須顯示指定初始值,系統不會對final成員隱形初始化,final修飾局部變量,修飾形參
- final修飾引用變量,final保證指向的對象不變,但對象內容可以改變。
- final修飾變量,宏定義,定義final時就為變量指定初始值,在編譯時確定,final變量實際是宏變量。
- 修飾方法,不可被子類重寫。但可以被類內重載
- 修飾類:不可以有子類,不可被繼承、
?
- 不可變類:創建該類實例后,該實例實例變量不可改變。
- 規則:1.用private和final修飾該類成員變量? ?2.提供帶參數構造器,傳入參數來初始化。? 3.只為該類成員提供getter().不能setter()
?抽象:
- 抽象方法,抽象類:abstract。
- 抽象方法不能有方法體,抽象類不能被實例化,不能new.這個類只能被繼承。
- 抽象方法沒有方法體,必須被子類重寫。
- final與abstract不能同時用。static和abstract也不能同時修飾同個方法。
- 抽象類只定義某些方法,把不能實現的部分抽象成抽象方法,留給子類實現。
?