願景:"讓程式設計不再難學,讓技術與生活更加有趣"
更多架構課程請通路 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(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯
- 構造函數 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
- 一個類裡面,方法名字相同但參數不同,傳回類型可以相同也可以不同
- 比如構造函數重載
- 方法重寫 overriede
注意核心區分
- 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); } }
幹貨文檔
關注公衆号發送:“CSDN幹貨文檔” 即可領取