1. 程式人生 > >Java面向物件重點總結

Java面向物件重點總結

01 成員變數和區域性變數的區別

  • 在程式碼中位置不同
    • 成員變數:在類中方法外
    • 區域性變數:在方法定義中或方法宣告上
  • 在記憶體中的位置不同
    • 成員變數:在堆記憶體(成員變數屬於物件,物件進堆記憶體)
    • 區域性變數:在棧記憶體(區域性變數屬於方法,方法進棧記憶體)
  • 生命週期不同
    • 成員變數:隨物件的建立而存在,隨物件的消失而消失
    • 區域性變數:隨方法的呼叫而存在,隨方法的呼叫結束而消失
  • 初始化值不同
    • 成員變數:有預設初始化值
    • 區域性變數:沒有預設初始化值,必須先定義和賦值才能使用

02 構造方法

  • 作用
    • 給物件的屬性初始化
  • 注意事項
    • 如果我們沒有給出構造方法,系統會自動提供一個沒有引數的構造方法
    • 如果我們自己給出了構造方法,系統將不會提供預設的構造方法
      • 這個時候,如果還想使用無參的構造方法,就必須自己給出

03 建立一個物件的過程

Student s = new Student();

1. Student.class載入進記憶體
2. 宣告一個Student型別引用s
3. 在堆記憶體建立物件
4. 給物件中屬性預設初始化值
5. 屬性進行顯式初始化
6. 構造方法進棧,給物件中的屬性賦值,構造方法彈棧
7. 將物件的地址值賦值給s

04 static關鍵字

  • 特點
    • 隨著類的家載入而載入
    • 優先於物件存在
    • 被類的所有物件共享
    • 可以通過類名呼叫
  • 注意事項
    • 靜態方法中沒有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”的關係,擴充套件功能定義的是該繼承體系的

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.成員名