Java面向物件重點總結
阿新 • • 發佈:2019-01-24
01 成員變數和區域性變數的區別
- 在程式碼中位置不同
- 成員變數:在類中方法外
- 區域性變數:在方法定義中或方法宣告上
- 在記憶體中的位置不同
- 成員變數:在堆記憶體(成員變數屬於物件,物件進堆記憶體)
- 區域性變數:在棧記憶體(區域性變數屬於方法,方法進棧記憶體)
- 生命週期不同
- 成員變數:隨物件的建立而存在,隨物件的消失而消失
- 區域性變數:隨方法的呼叫而存在,隨方法的呼叫結束而消失
- 初始化值不同
- 成員變數:有預設初始化值
- 區域性變數:沒有預設初始化值,必須先定義和賦值才能使用
02 構造方法
- 作用
- 給物件的屬性初始化
- 注意事項
- 如果我們沒有給出構造方法,系統會自動提供一個沒有引數的構造方法
- 如果我們自己給出了構造方法,系統將不會提供預設的構造方法
- 這個時候,如果還想使用無參的構造方法,就必須自己給出
03 建立一個物件的過程
Student s = new Student();
1. Student.class載入進記憶體
2. 宣告一個Student型別引用s
3. 在堆記憶體建立物件
4. 給物件中屬性預設初始化值
5. 屬性進行顯式初始化
6. 構造方法進棧,給物件中的屬性賦值,構造方法彈棧
7. 將物件的地址值賦值給s
04 static關鍵字
- 特點
- 隨著類的家載入而載入
- 優先於物件存在
- 被類的所有物件共享
- 可以通過類名呼叫
- 注意事項
- 靜態方法中沒有this關鍵字
- 靜態方法隨著類的載入而載入,比物件先存在,而this是隨著物件的建立而存在的
- 靜態方法只能訪問靜態的成員變數和靜態的成員方法
- 靜態方法中沒有this關鍵字
05 靜態變數和成員變數的區別
- 所屬不同
- 靜態變數屬於類,也稱為類變數
- 成員變數屬於物件,也稱為例項變數
- 記憶體中位置不同
- 靜態變數儲存於方法區中的靜態區
- 成員變數儲存於堆記憶體
- 生命週期不同
- 靜態變數隨著類的載入而載入,隨著類的消失而消失
- 成員變數隨著物件的建立而建立,隨著類的消失而消失
- 呼叫方式不同
- 靜態變數可以通過類名呼叫,也可以通過物件呼叫
- 成員變數只能通過物件名呼叫
06 程式碼塊
- 區域性程式碼塊
- 在方法中出現,限定變數生命週期,及早釋放,提高記憶體利用率
- 構造程式碼塊(初始化程式碼塊)
- 在類中方法外出現,多個構造方法中相同的程式碼存放在一起,在構造方法前執行
- 當構造方法過載時,構造程式碼塊在最終實際執行的構造方法前執行
- 靜態程式碼塊
- 在類中方法外出現,加上static修飾,用於給類進行初始化
- 在類載入的時候執行,且只執行一次,多用於載入驅動
07 this和super
- this代表當前物件的引用,super代表當前物件的父類的引用
- 呼叫成員變數
- this.成員變數 呼叫本類的成員變數,也可以呼叫父類的成員變數·
- super.成員變數 呼叫父類的成員變數
- 呼叫構造方法
- this(引數); 呼叫本類的構造方法
- super(引數); 呼叫父類的構造方法
- 呼叫成員方法
- this.成員方法 呼叫本類的成員方法,也可以呼叫父類的成員方法
- super.成員方法 呼叫父類的成員方法
08 繼承中的構造方法
- 子類中所有的構造方法都預設訪問父類中無參的構造方法
- 因為子類會繼承父類中的資料,可能還會使用父類的資料
- 所以,子類初始化前,一定會先完成父類的初始化
- super或this必須出現在構造方法的第一條語句上
09 方法的重寫
- 父類中私有的方法不能重寫
- 重寫父類方法時,訪問許可權不能更低,最好一致
- 父類的靜態方法,子類必須通過靜態方法進行覆蓋
- 子類物件呼叫方法時,先找本身,再找父類
10 方法重寫和方法過載的區別
- 方法重寫:子類中的方法和父類方法宣告一模一樣,返回值一致
- 方法過載:同一個類中方法的方法名一樣,引數列表不同,與返回值無關
11 多型
Person p = new Student(); //向上轉型
Student s = (Student)p; //向下轉型
- 好處
- 父類可以當作形式引數,接收任何子類的物件
- 弊端
- 不能使用子類特有的屬性和方法
12 抽象類
- 抽象類和方法必須使用abstract關鍵字修飾
- 抽象類不一定有抽象方法,有抽象方法的類一定時抽象類
- 抽象類不能例項化,可以利用多型由具體的子類例項化
- 抽象類的子類要麼是抽象類,要麼就重寫抽象類中所有的抽象方法
- 抽象類的成員
- 成員變數:可以是常量也可以是變數,abstract不能修飾成員變數
- 構造方法:抽象類有構造方法,由子類訪問父類的初始化
13 介面和抽象類的區別
- 成員變數
- 抽象類:可以是變數也可以是常量
- 介面:只能是常量
- 構造方法
- 抽象類:有構造方法
- 介面:沒有構造方法
- 成員方法
- 抽象類:可以抽象,也可以不抽象
- 介面:只能是抽象方法
- 設計理念
- 抽象類:被繼承,體現的是“is a”的關係,定義的是發繼承體系的共有功能
-介面:被實現,體現的是“like a”的關係,擴充套件功能定義的是該繼承體系的
- 抽象類:被繼承,體現的是“is a”的關係,定義的是發繼承體系的共有功能
14 許可權修飾符
/ | 本類 | 同一個包 | 不同包子類 | 不同包 |
---|---|---|---|---|
private | y | |||
預設 | y | y | ||
protected | y | y | y | |
public | y | y | y | y |
15 內部類
- 特點
- 內部內可以直接訪問外部類的成員,包括私有的
- 外部類要訪問內部類的成員,必須要建立物件
成員內部類
Outer.Inner oi = new Outer().new Inner;
靜態內部類
Outer.Inner oi = new Outer.Inner();
匿名內部類
new 類名或介面名(){ //重寫方法 }
內部類的注意事項
- 區域性內部類訪問的區域性變數必須使用final修飾
- 當該方法呼叫完畢,區域性變數會消失,但區域性內部類建立的物件可能還存在,需要呼叫該區域性變數時會無法找到
- jdk1.8取消了,沒有final關鍵字也能通過編譯
內部類訪問外部類成員
外部類名.this.成員名
- 區域性內部類訪問的區域性變數必須使用final修飾