天天看點

小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP

小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP

 願景:"讓程式設計不再難學,讓技術與生活更加有趣"

更多架構課程請通路 xdclass.net

目錄

第1集 什麼是面向對象對象程式設計OOP

第2集 Java面向對象的中的構造函數和封裝

第3集 Java面向對象核心關鍵字this講解

第4集 Java面向對象程式設計之繼承

第5集 Java面向對象程式設計之繼承的super關鍵詞

第6集 Java面向對象程式設計之抽象

第7集 Java面向對象程式設計之接口

第8集 Java面向對象程式設計之InstanceOf關鍵詞和多态

第9集 本章課程作業練習題之簡單電腦編寫

第10集 本章課程作業常見問題和答案解析

幹貨文檔

第1集 什麼是面向對象對象程式設計OOP

簡介:講解什麼是面向對象程式設計

    • 就是模闆,用來定義一類對象的方法和屬性,比如人、學生、貓,萬物都是有模闆,都是可以定義為類。 (類名首字母大寫)
    class Student{
        
    }
    ​
    class Person{
        
    }
    ​
    class Cat{
        
    }
               
  • 對象
    • 類的執行個體化,比如 學生這個類執行個體化,就是 XX同學
    Student student = new Student();
    Cat cat1 = new Cat();
    new Persion();
               
  • 方法
    • 方法是語句的集合,在一起完成一個功能
    • 方法包含于類或對象中,即普通方法或者類方法
      修飾符 傳回值類型 方法名(參數類型 參數名){
          ...
          方法體
          ...
          return 傳回值;
      }
                 
  • 繼承
    • 子類繼承父類的特征和行為,使得子類對象具有父類的方法和屬性
    • 父類也叫基類,具有公共的方法和屬性
      • 動物<-貓
      • 動物<-狗
  • 多态
    • 同一個行為具有多個不同表現形式的能力
    • 優點:減少耦合、靈活可拓展
    • 一般是繼承類或者重寫方法實作
  • 抽象
    • 關鍵詞abstract聲明的類叫作抽象類,abstract聲明的方法叫抽象方法
    • 一個類裡包含了一個或多個抽象方法,類就必須指定成抽象類
    • 抽象方法屬于一種特殊方法,隻含有一個聲明,沒有方法體

第2集 Java面向對象的中的構造函數和封裝

簡介: 面向對象構造函數的使用和方法的封裝

  • 什麼是構造函數
    • 一種特殊的方法
    • 建立對象時用來初始化對象,每次使用new 建立對象的時候,就會使用構造函數
    • 與類具有相同的名稱,但是沒有傳回值
    • Java會自動為每個類提供一個預設構造函數
    • 如果自己定義了構造函數,就不再使用預設構造函數,如果沒有顯示的寫出預設構造函數,則會消失
    • 注意點:如果構造函數之間互相調用,務必寫在方法第一行      
  • 構造函數種類
    • 預設構造函數
      public 類名(){
      ​
      }      
    • 無參構造函數
      public 類名(){
      //寫自定義的語句
      }      
    • 有參構造函數
      public 類名(參數類型1  參數名1,參數類型2 參數名2...){
      //自定義方法體
      }      
  • 構造函數的修飾符
    • public 用的最多,用來建立對象
    • private 私有化構造函數,不給外部建立對象,比如工具類,或者單例設計模式
    • default 預設的話,隻能在目前包裡面使用new 建立對象,幾乎不用
  • 什麼是封裝
    • 封裝是把過程和資料包圍起來,對資料的通路隻能通過已定義的接口即方法
    • 在java中通過關鍵字private,protected和public實作封裝。
    • 什麼是封裝?封裝把對象的所有組成部分組合在一起,封裝定義程式如何引用對象的資料,封裝實際上使用方法将類的資料隐藏起來,控制使用者對類的修改和通路資料的程度。 适當的封裝可以讓代碼更容易了解和維護,也加強了代碼的安全性
    • 類封裝
    • 方法封裝
  • overload(重載,過載)
    • 在一個類裡面,方法名字相同,而參數不同,和傳回類型無關
  • override(重寫,覆寫)
    • 子類對父類的允許通路的方法的實作過程進行重新編寫, 傳回值和形參都不能改變
      • 傳回值類型,方法名,參數類型以及個數
    • 子類能夠根據需要實作父類的方法

第3集 Java面向對象核心關鍵字this講解

簡介:講解java核心關鍵詞this的用法和指向

  • this關鍵字
    • 當一個對象建立後,JVM會給這個對象配置設定一個引用自身的指針,這個指針的名字就是 this
    • 隻能用于非靜态方法體内,靜态方法和代碼塊不能出現this
    • this就是指向目前對象本身
  • 使用場景
    • this(參數類型1 參數名,...) 表示目前類對應的構造函數
    • 方法形參和對象的屬性重名,用this來區分
      public void setAge(int age){
          this.age = age;
      }
      ​
      
      
                 

第4集 Java面向對象程式設計之繼承

簡介:講解對象繼承的概念和使用

  • 繼承
    • 子類繼承父類的特征和行為,使得子類對象具有父類的方法和屬性
    • 父類也叫基類,具有公共的方法和屬性,生活中的例子
      • 動物<-貓
      • 動物<-狗
    • java中的繼承,減少重複代碼
      • 使用前
      • 使用後
  • 格式,通過extends關鍵字
    class 父類名稱{
        
    }
    ​
    class 子類名稱 extends 父類名稱{
        
    }
               
  • 特點
    • 子類擁有父類的非private的屬性和方法
    • 子類可以用自己的方式實作父類的方法 override(重寫,覆寫)
    • 實作了代碼的複用
    • 重寫從父類那裡繼承來的方法的,當調用方法時候會優先調用子類的方法(預設就近原則)
  • 注意:
    • 不支援多繼承,支援多重繼承,多重繼承提高了耦合性,組合優于繼承
    • 所有的類都是繼承于 java.lang.Object
    • final關鍵字
      • 修飾的類,則這個類不可以被繼承
      • 修飾方法,則這個方法不允許被覆寫(重寫)

第5集 Java面向對象程式設計之繼承的super關鍵詞

簡介:講解 java繼承裡面的super關鍵字

  • super關鍵字
    • 一個引用變量,用于引用父類對象
    • 父類和子類都具有相同的命名方法,要調用父類方法時使用
    • 父類和子類都具有相同的命名屬性,要調用父類中的屬性時使用
    • super也是父類的構造函數,格式 super(參數)
      • 注意點 調用super() 必須是類構造函數中的第一條語句,否則編譯不通過
  • 注意
    • 每個子類構造方法的第一條語句,都是隐含地調用super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯
      public class Father {
          public Father(){
              System.out.println("father 無參構造函數");
          }
      }
      public class Children extends Father{
          public Children(){
              //預設存在,寫和不寫都行
              super();
              System.out.println("Child無參構造函數");
          }
      }
                 
    • this()和super()都指的是對象,均不可以在static環境中使用
      • 包括:static變量,static方法,static語句塊。
  • 構造函數 super和this
    • this 和super在構造函數中隻能有一個,且都必須是構造函數當中的第一行
    • 當父類的構造函數是無參構造函數時,在子類的構造函數中,不用顯式super()去調用父類的構造函數,
    • 當父類的構造函數是有參構造函數時,如果子類的構造函數中不寫super()進行調用父類的構造函數,編譯器會報錯
  • java繼承後類的初始化順序
    • 問題:靜态代碼塊、非靜态代碼、父類/子類無參構造方法、父類/子類的一般方法
public class Father {
​
    static {
        System.out.println("父類靜态代碼塊");
    }
​
    public Father(){
        System.out.println("father 無參構造函數");
    }
​
    public Father(int age){
        System.out.println("father 有參構造函數");
    }
​
    public void sleep(){
        System.out.println("father sleep方法");
    }
​
}
​
public class Children extends Father{
​
    static {
        System.out.println("Child靜态代碼塊");
    }
​
    public Children(){
        //super();
        System.out.println("Child無參構造函數");
        super.sleep();
    }
​
    public void sleep(){
        System.out.println("Child sleep方法");
    }
}
​
public static void main(String[] args) {
        new Children().sleep();
 }
           

第6集 Java面向對象程式設計之抽象

簡介:講解抽象的好處,抽象類和抽象方法

  • 什麼是抽象
    • 需求
      • 動物都有年齡和名稱,但是吃的不一樣,羊吃草,老虎吃肉,但是都是閉着眼睛睡覺的
      • 車,都有名稱和價格,也有跑的方法,但是最高速度或者動力來源不一樣
    • 當父類的某些方法不确定時,可以用abstract關鍵字來修飾該方法,即抽象方法,用abstract來修飾該類,即抽象類
    • 抽象類将事物的共性的東西提取出來,由子類繼承去實作,代碼易擴充、易維護
    • java中的抽象類和抽象方法
    //抽象類
    abstract class 類名{
    }
    //抽象方法,不能有方法主體
    abstract 傳回類型 方法名();
    public abstract class Vehicle {
        
        public abstract void run();
    ​
        public void stop(){
            System.out.println("停在路上");
        }
    }
    ​
    class Bicycle extends Vehicle{
        @Override
        public void run() {
            System.out.println("人工驅動");
        }   
    }
    ​
    class Automobile extends Vehicle{
        @Override
        public void run() {
            System.out.println("汽油驅動");
        }
    }
    ​
               
  • 抽象特點:
    • 抽象類的特點
      • 抽象類不能被執行個體化,因為抽象類中方法未具體化,這是一種不完整的類,是以不能直接執行個體化,編譯無法通過
      • 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類
      • 如果一個抽象類中可以沒有抽象方法,這樣做的目的是為了此類不能被執行個體化。
      • 抽象類的子類必須給出抽象類中的抽象方法的具體實作,否則子類也是抽象類,需要用abstract聲明
      • 抽象類不能使用final關鍵字修飾,因為final修飾的類是無法被繼承
    • 抽象方法的特點
      • 抽象類中的抽象方法隻是聲明,不包含方法體
      • 抽象方法不能用private修飾,因為抽象方法必須被子類實作(覆寫),而private權限對于子類來 說是不能通路的
      • 一個類繼承了一個抽象類,那麼它必須全部覆寫抽象類中的抽象方法,當然也可以不全部覆寫,如果 不覆寫全部抽象方法則這個子類也必須是抽象類
    • 構造方法,類方法(即static 修飾的方法)不能聲明為抽象方法

第7集 Java面向對象程式設計之接口

簡介:講解Java裡面的接口interface

  • 什麼是接口
    • 是抽象方法的集合,接口通常以interface來聲明,一個類通過繼承接口的方式,進而來繼承接口的抽象方法
    • 文法
      interface 名稱 [extends 其他的接口名] {
              // 聲明變量
              // 抽象方法
             int getMoney(); 
      }
          
          
      ​
      * 接口的特點
        * 接口的方法都是抽象方法,預設都是  public abstract,其他修飾符都會報錯
        * 接口中可以含有變量,但是接口中的變量會被隐式的指定為 **public static final**
        * 類描述對象的屬性和方法,而接口則包含類要實作的方法
        * 接口無法被執行個體化,需要被實作才行
        * 一個實作接口的類,必須實作接口内所描述的所有方法,否則就必須聲明為抽象類
      * 接口和類的差別
        * 接口沒有構造函數
        * 接口裡可以有靜态方法和方法體
        * 接口中所有的方法必須是抽象方法(JDK8之後就不是)
        * 接口不是被類繼承了,而是要被類實作
        * 接口支援多繼承, 類不支援多個類繼承
      ​
      ​
      ​
      * 接口的實作implements
      ​
        * 當類實作接口的時候,類要實作接口中所有的方法,不然類必須聲明為抽象的類,使用implements關鍵字實作所有接口
      ​
        * 文法
      ​
      class 類名 implements 接口名稱[, 其他接口名稱, 其他接口名稱]{
          //要實作的方法
      }
      ​
      ```
                 
  • 注意
    • 一個類隻能繼承一個類,但是能實作多個接口
    • 接口能繼承另一個接口,接口的繼承使用extends關鍵字,和類繼承一樣
  • JDK8新特性
    • interface中可以有static方法,但必須有方法實作體,該方法隻屬于該接口,接口名直接調用該方法
    • 接口中新增default關鍵字修飾的方法,default方法隻能定義在接口中,可以在子類或子接口中被重寫

      default定義的方法必須有方法體

    • 父接口的default方法如果在子接口或子類被重寫,那麼子接口實作對象、子類對象,調用該方法,以重寫為準
    • 本類、接口如果沒有重寫父類(即接口)的default方法,則在調用default方法時,使用父類定義的default方法邏輯
public interface IPay{  
​
    // static修飾符定義靜态方法  
    static void staticMethod() {  
        System.out.println("接口中的靜态方法");  
    }  
  
    // default修飾符定義預設方法 ,預設方法不是抽象方法,可以不重寫也可以重寫 
    default void defaultMethod() {  
        System.out.println("接口中的預設方法");  
    }  
}  
// static方法必須通過接口類調用  
 IPay.staticMethod();  
  
 //default方法必須通過實作類的對象調用  
 new IPay().defaultMethod(); 


           

第8集 Java面向對象程式設計之InstanceOf關鍵詞和多态

簡介:講解 InstanceOf關鍵詞使用,什麼是多态

  • InstanceOf 關鍵詞
    • 是Java的一個二進制操作符(運算符),也是Java的保留關鍵字
    • 作用
      • 判斷一個類是否實作了某個接口,或者判斷一個執行個體對象是否屬于一個類
      • 文法
      //如果該object 是該class的一個執行個體,那麼傳回true。如果該object 不是該class的一個執行個體,或者object是null,則傳回false
      ​
      boolean result = object instanceof class
      參數:
        result :boolean類型。
        object :必選項。任意對象表達式。
        class:必選項。任意已定義的對象類。
                 
      • 對象類型強制轉換前的判斷
      Person p1 = new Student();
      //判斷對象p是否為Student類的執行個體
      if(1p instanceof Student)
      {
         //向下轉型
         Student s = (Student)p1;
      }
                 
  • 方法重寫和重載
    • 方法重寫 overriede
      • 子類對父類的允許通路的方法的實作過程進行重新編寫,
      • 注意點
        • 傳回值和形參都不能改變
        • 父類的成員方法隻能被它的子類重寫
        • final 和 static的方法不能被重寫
        • 構造方法不能被重寫
        • 通路權限不能比父類中被重寫的方法的通路權限更低
    • 方法重載 overload
      • 一個類裡面,方法名字相同但參數不同,傳回類型可以相同也可以不同
      • 比如構造函數重載

注意核心區分

  • override是在不同類之間的行為,overload是在同一個類中的行為
  • 總結:Java多态
    • 同一個行為具有多個不同表現形式或形态的能力
    • 常見的方式
      • 繼承方法重寫
      • 同類方法重載
      • 抽象方法
      • 接口

第9集 本章課程作業練習題之簡單電腦編寫

簡介: 根據本章知識點布置課程作業

  • 寫個電腦,能完成加減乘除運算
    • 定義接口做參數
    • 加減乘除定義4個類
    • 定義一個靜态工具類,把下面的接口作為其中一個形參對象,傳遞具體的運算符類完成計算
    interface ICompute{
        int computer(int num1, int num2);
    }
    ​
               

第10集 本章課程作業常見問題和答案解析

簡介: 講解課程作業常見問題和答案解析

  • 寫個電腦,能完成加減乘除運算
    • 定義接口做參數
    • 加減乘除定義4個類
    • 定義一個靜态工具類,把下面的接口作為其中一個形參對象,傳遞具體的運算符類完成計算
    interface ICompute{
        int computer(int num1, int num2);
    }
    ​
    public class AddOper implements ICompute {
        @Override
        public int computer(int num1, int num2) {
            return num1 + num2;
        }
    }
    ​
    ​
    public class SubOper implements ICompute {
    ​
        @Override
        public int computer(int num1, int num2) {
            return num1 - num2;
        }
    }
    ​
    ​
    public class MulOper implements ICompute {
    ​
        @Override
        public int computer(int num1, int num2) {
            return num1*num2;
        }
    }
    ​
    public class DivideOper implements ICompute {
    ​
        @Override
        public int computer(int num1, int num2) {
    ​
            try {
                return num1/num2;
            }catch (Exception e){
                e.printStackTrace();
            }
            return -1;
        }
    }
    ​
    ​
    ​
    public class UseCompute {
    ​
        public static void compute(ICompute compute, int num1, int num2){
    ​
            int result = compute.computer(num1,num2);
            System.out.println(result);
        }
    ​
    ​
    //    public static void add(AddOper compute, int num1, int num2){
    //
    //        int result = compute.computer(num1,num2);
    //        System.out.println(result);
    //    }
    //
    //    public static void sub(SubOper compute, int num1, int num2){
    //
    //        int result = compute.computer(num1,num2);
    //        System.out.println(result);
    //    }
    ​
    ​
        public static void main(String [] args){
            UseCompute.compute(new AddOper(),25,5);
            UseCompute.compute(new SubOper(),25,5);
            UseCompute.compute(new MulOper(),25,5);
            UseCompute.compute(new DivideOper(),25,0);
        }
    ​
    }
    ​
    ​
    
               

幹貨文檔

小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP
小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP
小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP
小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP

                                                        關注公衆号發送:“CSDN幹貨文檔”  即可領取

小滴課堂-學習筆記:(6)Java 面向對象程式設計OOP