1、面向對象的特徵
一般來講有三大特徵,封裝、繼承、多態,可以再加一個抽象。其中多態是最重要的
多態是指允許不同子類型的對象對同一消息作出不同的響應。
多態包括編譯時多態和運行時多態。
方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫(override)實現的是運行時的多態性(也稱爲後綁定)。
運行時多態是面向對象最精髓的東西,要實現運行時多態需要:
- 方法重寫:子類繼承父類並重寫父類中已有的或抽象的方法。
- 對象造型:將父類型的引用指向子類型的對象,這樣父類的引用調用同樣的方法時即會根據子類對象的不同而表現出不同的行爲
2、修飾符
修飾符 | 當前類 | 同包 | 子類 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
3、基本數據類型
Java中的基本數據類型只有8個:byte(1字節)、short(2字節)、int(4字節)、long(8字節)、float(4字節)、double(8字節)、char、boolean。
除了以上8種基本數據類型,其餘的都是引用數據類型。
對應的包裝類分別是:Byte、Short、Integer、Long、Float、Double、Character、Boolean
char佔用幾個字節:
- java中內碼(運行內存)中的char使用UTF16的方式編碼,一個char佔用兩個字節,但是某些字符需要兩個char來表示。所以,一個字符會佔用2個或4個字節。
- java中外碼中char使用UTF8的方式編碼,一個字符佔用1~6個字節。
- UTF16編碼中,英文字符佔兩個字節;絕大多數漢字(尤其是常用漢字)佔用兩個字節,個別漢字(在後期加入unicode編碼的漢字,一般是極少用到的生僻字)佔用四個字節。
- UTF8編碼中,英文字符佔用一個字節;絕大多數漢字佔用三個字節,個別漢字佔用四個字節
4、基本類型之間如何轉換
自動轉換:容量小的類型自動轉換爲容量大的數據類型
- 多種類型的數據混合運算時,系統先自動將所有數據轉換成容量最大的那種數據類型,再進行計算。
- 當把任何基本類型的值和字符串值進行連接運算時(+),基本類型的值將自動轉化爲字符串類型
強制轉換:將容量大的轉換爲容量小的數據類型
- 使用時要加上強制轉換符“()”,但可能造成精度降低或溢出。
- 字符串不能直接轉換爲基本類型,需要藉助基本類型對應的包裝類來實現
擴展問題1:float f=3.4;是否正確?
參考答案:不正確。3.4是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱爲窄化)會造成精度損失,因此需要強制類型轉換float f =(float)3.4; 或者寫成float f =3.4F;
擴展問題2:short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
short s1 = 1沒用錯,因爲1是int但1沒有超過short的範圍,但是int a = 1;short s1=a有錯,因爲a是int型,不符合類型自動轉換
參考答案:對於short s1 = 1; s1 = s1 + 1;由於1是int類型,因此s1+1運算結果也是int 型,需要強制轉換類型才能賦值給short型。
而short s1 = 1; s1 += 1;可以正確編譯,因爲s1+= 1;相當於s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。
5、初始化順序
- 父類的靜態變量和靜態代碼塊
- 子類的靜態變量和靜態代碼塊
- 父類的實例變量和普通代碼塊
- 父類的構造函數
- 子類的實例變量和普通代碼塊
- 子類的構造函數
6、final關鍵字
關鍵字final表示「最終的」,可用來修飾類、屬性和方法.
- 修飾類:表示該類不能被繼承,以提高程序的安全性和可讀性,如String、System、StringBuffer類等。
- 修飾方法:表示方法不能被重寫,如Object類的getClass方法。
- 修飾屬性:表示變量一次賦值以後值不能被修改(常量),其名稱通常大寫。
補充:關鍵字final修飾的基本類型變量和引用類型變量有區別嗎?
對於基本類型變量,final使變量數值在一次賦值後不變;對於引用類型變量,final使變量引用在一次賦值後不變,即不能再引用其他對象,但被引用對象本身的屬性是可以修改的
關鍵字final修飾的成員變量沒有默認初始化值,其初始化方式主要有:
- 在聲明時,直接對其進行顯式初始化。
- 聲明完後,在代碼塊中對其顯式初始化。
- 聲明完後,在構造器中對其顯式初始化,但注意需要在所有構造器中均對其進行初始化操作。
7、static關鍵字
用法:
- 靜態導入
- 靜態變量
- 靜態方法
- 靜態代碼塊
- 靜態內部類
靜態導入:
當在程序中多次使用某類型的靜態成員(靜態屬性和靜態方法)時,即可使用靜態導入,作用是將該類型的靜態成員引入到當前的命名空間,那麼在程序中調用該類型的靜態成員時可以像調用本類內定義的成員一樣,直接調用,而無需採用「類名.靜態成員名」的方式。
缺點:雖然簡化代碼,但可讀性大大降低,幾乎不使用。
靜態內部類:
內部類的一種,靜態內部類不依賴於外部類,即可以不依賴於外部類實例對象而被實例化,且不能訪問外部類的非靜態成員(屬性和方法)。
8、抽象類和接口
接口可以含有屬性和方法。
- 屬性被隱式指定爲public static final的,即全局常量。
- 方法被隱式執行爲public abstract的,即抽象方法。
抽象類可以含有屬性、方法和構造器。
- 方法可以是普通方法也可以是抽象方法,若爲抽象方法則必須爲public或protected的,缺省情況下默認爲public的,因爲抽象方法需要被子類繼承和實現。
- 構造器雖然有,但因爲抽象類含有抽象方法,所以抽象類不能進行實例化。
語法層面上的區別:
- 成員變量:抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是常量,即public static final修飾的。
- 成員方法:抽象類中的成員方法可以是抽象的也可以是普通的(有具體實現的),而接口中的成員方法只能是public static修飾的。
- 靜態結構:抽象類中可以有靜態代碼塊和靜態方法,而接口中不能有靜態代碼塊和靜態方法。
- 構造方法:抽象類中可以有構造器,而接口中沒有,但兩者都不能進行實例化,但可以定義抽象類和接口類型的引用。
- 繼承與實現:一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。