国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站頂部展出的大幅廣告推廣網(wǎng)站源碼

網(wǎng)站頂部展出的大幅廣告,推廣網(wǎng)站源碼,wordpress 點(diǎn)贊,建設(shè)銀行住房公積金預(yù)約網(wǎng)站一、面向?qū)ο蟾呒?jí) 此筆記參考黑馬教程,僅學(xué)習(xí)使用,如有侵權(quán),聯(lián)系必刪 文章目錄 一、面向?qū)ο蟾呒?jí)1. static(靜態(tài))1.1 static 修飾成員變量1.1.1 static1.1.2 成員變量的執(zhí)行原理總結(jié) 1.2 static 修飾成員變量的應(yīng)用場(chǎng)…

一、面向?qū)ο蟾呒?jí)

此筆記參考黑馬教程,僅學(xué)習(xí)使用,如有侵權(quán),聯(lián)系必刪

文章目錄

  • 一、面向?qū)ο蟾呒?jí)
    • 1. static(靜態(tài))
      • 1.1 static 修飾成員變量
        • 1.1.1 static
        • 1.1.2 成員變量的執(zhí)行原理
        • 總結(jié)
      • 1.2 static 修飾成員變量的應(yīng)用場(chǎng)景
        • 類變量的應(yīng)用場(chǎng)景
        • 案例:
        • 總結(jié)
      • 1.3 static 修飾成員方法
        • 1.3.1 成員方法的分類
        • 1.3.2 成員方法的執(zhí)行原理
        • 代碼演示
        • 總結(jié)
      • 補(bǔ)充知識(shí):搞懂 mian 方法
      • 1.4 static 修飾成員方法的應(yīng)用場(chǎng)景
        • 1.4.1 類方法的常見(jiàn)應(yīng)用場(chǎng)景
        • 1.4.2 工具類是什么?
        • 1.4.3 使用類方法來(lái)設(shè)計(jì)工具類有啥好處?
        • 案例
          • 代碼實(shí)現(xiàn)
        • 多學(xué)一招
        • 總結(jié)
      • 1.5 static 的注意事項(xiàng)
        • 代碼演示
      • 1.6 static 的應(yīng)用知識(shí):代碼塊
        • 1.6.1 代碼塊概述
        • 代碼演示
      • 1.7 static 的應(yīng)用知識(shí):單例設(shè)計(jì)模塊
        • 1.7.1 什么是設(shè)計(jì)模式(Design pattern)?
          • 1.7.1.2 單例設(shè)計(jì)模式(餓漢式單例)
          • 1.7.1.3 單例模式的應(yīng)用場(chǎng)景和好處
          • 1.7.1.4 單例設(shè)計(jì)模式的實(shí)現(xiàn)方式很多
          • 總結(jié)
        • 1.7.2 懶漢式單例設(shè)計(jì)模式
    • 2. 面向?qū)ο笕筇卣髦?#xff1a;繼承
      • 2.1 繼承的快速入門
        • 2.1.1 認(rèn)識(shí)繼承、特點(diǎn)
          • 2.1.1.1 什么是繼承?
          • 2.1.1.2 繼承的特點(diǎn)
          • 2.1.1.3 繼承的執(zhí)行原理
          • 代碼實(shí)現(xiàn)
          • 總結(jié)
        • 2.1.2 繼承的好處、應(yīng)用場(chǎng)景
          • 2.1.2.1 使用繼承有啥好處?
          • 總結(jié)
      • 2.2 繼承相關(guān)的注意事項(xiàng)
        • 2.2.1 權(quán)限修飾符
          • 2.2.1.1 什么是權(quán)限修飾符?
          • 2.2.1.2 權(quán)限修飾符有幾種?各自的作用是什么?
          • 代碼演示
        • 2.2.2 單繼承、Object 類
          • 2.2.2.1 單繼承
          • 2.2.2.2 為何 Java 中的類不支持多繼承
          • 2.2.2.3 Object 類
          • 代碼演示
          • 總結(jié)
        • 2.2.3 方法重寫
          • 2.2.3.1 認(rèn)識(shí)方法重寫
          • 2.2.3.2 方法重寫的應(yīng)用場(chǎng)景
          • 總結(jié)
        • 2.2.4 子類中訪問(wèn)其他成員的特點(diǎn)
        • 2.2.5 子類構(gòu)造器的特點(diǎn)
          • 2.2.5.1 認(rèn)識(shí)子類構(gòu)造器的特點(diǎn)
            • 代碼演示
          • 2.2.5.1 常見(jiàn)的應(yīng)用場(chǎng)景
            • 代碼演示
          • 補(bǔ)充知識(shí):this(...) 調(diào)用兄弟構(gòu)造器
        • 2.2.6 注意事項(xiàng)小結(jié)
    • 3. 面向?qū)ο蟮娜筇卣髦?#xff1a;多態(tài)
      • 3.1 認(rèn)識(shí)多態(tài)
        • 3.1.1 什么是多態(tài)?
        • 3.1.2 多態(tài)的具體代碼實(shí)現(xiàn)
        • 3.1.3 多態(tài)的前提
        • 3.1.4 多態(tài)的一個(gè)注意事項(xiàng)
        • 代碼演示
      • 3.2 使用多態(tài)的好處
        • 3.2.1 使用多態(tài)的好處
        • 3.2.2 多態(tài)下會(huì)產(chǎn)生的一個(gè)問(wèn)題,怎么解決?
        • 代碼演示
        • 總結(jié)
      • 3.3 多態(tài)下的類型轉(zhuǎn)換問(wèn)題
        • 3.3.1 類型轉(zhuǎn)換
        • 3.3.2 強(qiáng)制類型轉(zhuǎn)換的一個(gè)注意事項(xiàng)
        • 3.3.3 強(qiáng)轉(zhuǎn)前,Java 建議:
        • 代碼演示
        • 總結(jié)

1. static(靜態(tài))

1.1 static 修飾成員變量

1.1.1 static
  • 叫靜態(tài),可以修飾成員變量、成員方法

成員變量按照有無(wú) static 修飾,分為兩種:

  • 類變量:有 static 修飾,屬于類,在計(jì)算機(jī)里只有一份,會(huì)被類的全部對(duì)象共享
  • 實(shí)例變量(對(duì)象的變量):無(wú) static 修飾,屬于每個(gè)對(duì)象的
public class Student {// 類變量static String name;// 實(shí)例變量(對(duì)象的變量)int age;
}

![](https://i-blog.csdnimg.cn/direct/97874ce1679f49558b8cae2fc878e5ca.png#pic_center =)

  • 把學(xué)生類看成一張學(xué)生表,可以創(chuàng)建出學(xué)生對(duì)象 s1 和 s2,age 沒(méi)有 static 修飾,所以是對(duì)象的變量,也就是每個(gè)學(xué)生對(duì)象中都有一個(gè)自己的 age。
  • 而成員變量 name 有 static 修飾,就是類變量,就是說(shuō)它只屬于當(dāng)前這個(gè)類自己持有,不屬于對(duì)象,也就是說(shuō)無(wú)論我們用這個(gè)類創(chuàng)建出了多少個(gè)學(xué)生對(duì)象,這些學(xué)生對(duì)象中都不會(huì)持有這個(gè)類變量 name

類變量訪問(wèn)方法

類名.類變量(推薦)
對(duì)象.類變量(不推薦)

實(shí)例變量訪問(wèn)方法

對(duì)象.實(shí)例變量
1.1.2 成員變量的執(zhí)行原理

總結(jié)
  1. static 是什么?
  • 叫靜態(tài),可以修飾成員變量、成員方法
  1. static 修飾的成員變量叫什么?怎么使用?有啥特點(diǎn)?
  • 類變量(靜態(tài)成員變量)
類名.類變量(推薦)
對(duì)象.類變量(不推薦)
  • 屬于類,與類一起加載一次,在內(nèi)存中只有一份,會(huì)被類的所有對(duì)象共享
  1. 無(wú) static 修飾的成員變量叫什么?怎么使用?有啥特點(diǎn)?
  • 實(shí)例變量(對(duì)象變量)
對(duì)象.實(shí)例變量
  • 屬于對(duì)象,每個(gè)對(duì)象中都有一份

1.2 static 修飾成員變量的應(yīng)用場(chǎng)景

類變量的應(yīng)用場(chǎng)景
  • 在開發(fā)中,如果某個(gè)數(shù)據(jù)只需要一份,且希望能夠被共享(訪問(wèn)、修改),則該數(shù)據(jù)可以定義成類變量來(lái)記住
案例:
  • 系統(tǒng)啟動(dòng)后,要求用戶類可以記住自己創(chuàng)建了多少個(gè)用戶對(duì)象了

  • User.java

package Advanced.a_static.d1_staticdemo;public class User {// 類變量public static int number; // public是讓它對(duì)外完全公開和暴露的public User() {
//        User.number++;// 注意:在同一個(gè)類中,訪問(wèn)自己類的類變量,才可以省略類名不寫number++;}
}
  • Test2.java
package Advanced.a_static.d1_staticdemo;public class Test2 {public static void main(String[] args) {// 目標(biāo):通過(guò)案例理解類變量的應(yīng)用場(chǎng)景User u1 = new User();User u2 = new User();User u3 = new User();User u4 = new User();System.out.println(User.number); // 4}
}
總結(jié)
  1. 成員變量有幾種?各自在什么情況下定義?
  • 類變量:數(shù)據(jù)只需要一份,且需要被共享時(shí)(訪問(wèn),修改)
  • 實(shí)例變量:每個(gè)對(duì)象都要有一份,數(shù)據(jù)各不同(如:name、score、age)
  1. 訪問(wèn)自己類中的類變量,是否可以省略類名不寫?
  • 可以的
  • 注意:在某個(gè)類中訪問(wèn)其他類里的類變量,必須帶類名訪問(wèn)

1.3 static 修飾成員方法

1.3.1 成員方法的分類
  • 類方法:有 static 修飾的成員方法,屬于類
public static void printHelloWorld() {System.out.println("Hello World!");System.out.println("Hello World!");
}
類名.類方法(推薦)
對(duì)象名.類方法(不推薦)
  • 實(shí)例方法:無(wú) static 修飾的成員方法,屬于對(duì)象
public void printPass() {...
}
對(duì)象.實(shí)例方法
1.3.2 成員方法的執(zhí)行原理

![](https://i-blog.csdnimg.cn/direct/259054213b87496fb0edc327c6fbff22.png#pic_center =500)


代碼演示
  • Student.java
package Advanced.a_static.d2_static_method;public class Student {double score;// 類方法public static void printHelloWorld() {System.out.println("Hello World!");System.out.println("Hello World!");}// 實(shí)例方法(對(duì)象的方法)public void printPass() {System.out.println("成績(jī):" + (score >= 60 ? "及格" : "不及格"));}
}
  • Test.java
package Advanced.a_static.d2_static_method;public class Test {public static void main(String[] args) {// 目標(biāo):掌握有無(wú)static修飾方法的用法// 1. 類方法的用法// 類名.類方法(推薦)Student.printHelloWorld();// 對(duì)象.類方法(不推薦)Student s = new Student();s.printHelloWorld();// 2. 實(shí)例方法的用法// 對(duì)象.實(shí)例方法s.printPass();}
}
總結(jié)
  1. static 修飾的成員方法叫什么?如何使用?
  • 類方法(靜態(tài)方法)
  • 屬于類,可以直接用類名訪問(wèn),也可以用對(duì)象訪問(wèn)
類名.類方法(推薦)
對(duì)象名.類方法(不推薦)
  1. 無(wú) static 修飾的成員方法叫什么?如何使用?
  • 實(shí)例方法(對(duì)象的方法)
  • 屬于對(duì)象,只能用對(duì)象訪問(wèn)
對(duì)象.實(shí)例方法

補(bǔ)充知識(shí):搞懂 mian 方法

public class Test {public static void main(String[] args) {...}
}
  1. main 方法是啥方法?
  • 類方法
    • 因?yàn)橛?static
  1. main 方法咋就能直接跑起來(lái)?
  • 我們用 Java 命令執(zhí)行這個(gè) Test 程序的時(shí)候,虛擬機(jī)其實(shí)會(huì)用這個(gè) Test 類直接去點(diǎn)這個(gè) main 方法來(lái)觸發(fā)這個(gè) main 方法的執(zhí)行
  • 為什么可以用類名直接去點(diǎn)這個(gè) main 方法執(zhí)行呢?因?yàn)?main 方法也是類方法
  1. 參數(shù) String[] args 是什么?
  • 當(dāng)我們來(lái)執(zhí)行這個(gè) main 方法的時(shí)候?qū)嶋H上我們可以送一些數(shù)據(jù)給這個(gè)參數(shù)接收的,這個(gè)參數(shù)它是一個(gè) String 類型的數(shù)組,它可以接一些數(shù)據(jù),然后讓你這個(gè) main 方法里面的程序來(lái)使用這些數(shù)據(jù)
  1. 怎么在執(zhí)行 main 方法的時(shí)候把數(shù)據(jù)傳給這個(gè)參數(shù)(String[] args)呢?
  • 在調(diào)用 java 命令執(zhí)行時(shí),直接跟在文件名后面

1.4 static 修飾成員方法的應(yīng)用場(chǎng)景

1.4.1 類方法的常見(jiàn)應(yīng)用場(chǎng)景
  • 類方法最常見(jiàn)的應(yīng)用場(chǎng)景是做工具類
1.4.2 工具類是什么?
  • 工具類中的方法都是一些類方法,每個(gè)方法都是用來(lái)完成一個(gè)功能的,工具類是給開發(fā)人員共同使用的
1.4.3 使用類方法來(lái)設(shè)計(jì)工具類有啥好處?
  • 提高了代碼復(fù)用;調(diào)用方便,提高了開發(fā)效率
public class XxxxUtil {public static void xxx() {...}public static boolean xxxx(String email) {...}public static String xxxxx(int n) {...}...
}
案例

需求:

  • 某系統(tǒng)的登錄界面需要開發(fā)并展示四位隨機(jī)的驗(yàn)證碼,系統(tǒng)的注冊(cè)界面需要開發(fā)并展示六位的隨機(jī)驗(yàn)證碼

這兩套程序的代碼幾乎一模一樣,存在大量重復(fù)代碼,這時(shí)我們就可以使用類方法設(shè)計(jì)一個(gè)工具類讓這兩個(gè)程序來(lái)調(diào)用,這樣就優(yōu)化好這個(gè)結(jié)構(gòu)了

代碼實(shí)現(xiàn)
  • MyUtil.java
package Advanced.a_static.d3_util;import java.util.Random;public class MyUtil {private MyUtil() {}public static String createCode(int n) {// 1. 定義2個(gè)變量是,一個(gè)是記住最終產(chǎn)生的隨機(jī)驗(yàn)證碼,一個(gè)是記住可能用到的全部字符String code = "";String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";Random r = new Random();// 2. 開始定義一個(gè)循環(huán)產(chǎn)生每位隨機(jī)數(shù)字符for (int i = 0; i < 4; i++) {// 3. 隨機(jī)一個(gè)字符范圍內(nèi)的索引int index = r.nextInt(data.length());// 4. 根據(jù)索引去全部字符中提取該字符code += data.charAt(index); // code = code + 字符}return code;}
}

  • 為什么工具類中的方法要用類方法,而不是實(shí)例方法?

    • 實(shí)例方法需要?jiǎng)?chuàng)建對(duì)象來(lái)調(diào)用,此時(shí)對(duì)象只是為了調(diào)用方法,對(duì)象占內(nèi)存,這樣會(huì)浪費(fèi)內(nèi)存
多學(xué)一招
  • 工具類沒(méi)有創(chuàng)建對(duì)象的需求,建議將工具類的構(gòu)造器進(jìn)行私有
總結(jié)
  1. 類方法有啥應(yīng)用場(chǎng)景?
  • 可以用來(lái)設(shè)計(jì)工具類
  1. 工具類是什么,有什么好處?
  • 工具類中的方法都是類方法,每個(gè)類方法都是用來(lái)完成一個(gè)功能的
  • 提高了代碼的復(fù)用性;調(diào)用方便,提高了開發(fā)效率
  1. 為什么工具類要用類方法,而不是實(shí)例方法?
  • 實(shí)例方法需要?jiǎng)?chuàng)建對(duì)象來(lái)調(diào)用,會(huì)浪費(fèi)內(nèi)存
  1. 工具類定義時(shí)有什么要求?
  • 工具類不需要?jiǎng)?chuàng)建對(duì)象,建議將工具類的構(gòu)造器私有化

1.5 static 的注意事項(xiàng)

  • 類方法中可以直接訪問(wèn)類的成員,不可以直接訪問(wèn)實(shí)例成員
  • 實(shí)例方法既可以直接訪問(wèn)類成員,也可以直接訪問(wèn)實(shí)例成員
  • 實(shí)例方法中可以出現(xiàn) this 關(guān)鍵字,類方法中不可以出現(xiàn) this 關(guān)鍵字的
代碼演示
package Advanced.a_static.d4_static_attention;public class Student {static String schoolName; // 類變量double score; // 實(shí)例變量// 1. 類方法中可以直接訪問(wèn)類的成員,不可以直接訪問(wèn)實(shí)例成員public static void printHelloWorld() {// 注意:同一個(gè)類中,訪問(wèn)類成員可以省略類名不寫schoolName = "Feng";Student.printHelloWorld2();//        System.out.println(score); // 會(huì)報(bào)錯(cuò)
//        printPass(); // 會(huì)報(bào)錯(cuò)//        System.out.println(this); // 會(huì)報(bào)錯(cuò)}// 類方法public static void printHelloWorld2() {}// 2. 實(shí)例方法中既可以直接訪問(wèn)類成員,也可以直接訪問(wèn)實(shí)例成員// 實(shí)例方法// 3. 實(shí)例方法中可以出現(xiàn)this關(guān)鍵字,類方法中不可以出現(xiàn)this關(guān)鍵字public void printPass() {schoolName = "Feng2";printHelloWorld2();System.out.println(score);printPass2();System.out.println(this); // 哪個(gè)對(duì)象調(diào)用它的實(shí)例方法 this就會(huì)指向哪個(gè)對(duì)象}// 實(shí)例方法public void printPass2() {}
}

1.6 static 的應(yīng)用知識(shí):代碼塊

1.6.1 代碼塊概述
  • 代碼塊是類的的5大成分之一(成員變量、構(gòu)造器、方法、代碼塊、內(nèi)部類)

代碼塊分為兩種:

  • 靜態(tài)代碼塊:

    • 格式:static {}
    • 特點(diǎn):類加載時(shí)自動(dòng)執(zhí)行,由于類只會(huì)加載一次,所以靜態(tài)代碼塊也只會(huì)執(zhí)行一次
    • 作用:完成類的初識(shí)化,例如:對(duì)類變量的初始化賦值
  • 實(shí)例代碼塊:

    • 格式:{}
    • 特點(diǎn):每次創(chuàng)建對(duì)象時(shí),執(zhí)行實(shí)例代碼塊,并在構(gòu)造器前執(zhí)行
    • 作用:和構(gòu)造器一樣,都是用來(lái)完成對(duì)象的初始化的,例如:對(duì)實(shí)例對(duì)象變量進(jìn)行初始化賦值
代碼演示
  • Student.java
package Advanced.a_static.d5_block;public class Student {static int number = 80;static String schoolName;// 靜態(tài)代碼塊static {System.out.println("靜態(tài)代碼塊執(zhí)行了");schoolName = "Feng";}// 實(shí)例代碼塊{System.out.println("實(shí)例代碼塊執(zhí)行了~~~");System.out.println("有人創(chuàng)建了對(duì)象" + this);}public Student() {System.out.println("無(wú)參數(shù)構(gòu)造器執(zhí)行了~~~");}public Student(String name) {System.out.println("有參數(shù)構(gòu)造器執(zhí)行了~~~");}
}
  • Test.java
package Advanced.a_static.d5_block;public class Test {public static void main(String[] args) {// 目標(biāo):認(rèn)識(shí)兩種代碼塊,了解他們的特點(diǎn)和基本作用System.out.println(Student.number); // 靜態(tài)代碼塊執(zhí)行了 80System.out.println(Student.number); // 80System.out.println(Student.number); // 80System.out.println(Student.schoolName); // FengSystem.out.println("-----------------------");Student s1 = new Student(); // 實(shí)例代碼塊執(zhí)行了~~~ 有人創(chuàng)建了對(duì)象Advanced.a_static.d5_block.Student@b4c966a 無(wú)參數(shù)構(gòu)造器執(zhí)行了~~~Student s2 = new Student("張三"); // 實(shí)例代碼塊執(zhí)行了~~~ 有人創(chuàng)建了對(duì)象Advanced.a_static.d5_block.Student@1d81eb93 有參數(shù)構(gòu)造器執(zhí)行了~~~}
}

1.7 static 的應(yīng)用知識(shí):單例設(shè)計(jì)模塊

1.7.1 什么是設(shè)計(jì)模式(Design pattern)?
  • 一個(gè)問(wèn)題通常有 n 種解法,其中肯定有一種解法是最優(yōu)的,這個(gè)最優(yōu)的解法被人總結(jié)出來(lái)了,稱之為設(shè)計(jì)模式
  • 設(shè)計(jì)模式有20多種,對(duì)應(yīng)20多種軟件開發(fā)中會(huì)遇到的問(wèn)題
1.7.1.2 單例設(shè)計(jì)模式(餓漢式單例)
  • 確保一個(gè)類只有一個(gè)對(duì)象

寫法

  • 把類的構(gòu)造器私有
  • 定義一個(gè)類變量記住類的一個(gè)對(duì)象
  • 定義一個(gè)類方法,返回對(duì)象

代碼實(shí)現(xiàn)

  • A.java
package Advanced.a_static.d6_singleInstance;public class A {// 2.定義一個(gè)類變量記住類的對(duì)象private static A a = new A();// 1. 必須私有類的構(gòu)造器// 使得外面不能創(chuàng)建對(duì)象private A() {}// 3. 定義一個(gè)類方法返回類的對(duì)象public static A getObject() {return a;}
}
  • Test1.java
package Advanced.a_static.d6_singleInstance;public class Test1 {public static void main(String[] args) {// 目標(biāo):掌握單例設(shè)計(jì)模式的寫法A a1 = A.getObject();A a2 = A.getObject();System.out.println(a1); // Advanced.a_static.d6_singleInstance.A@b4c966aSystem.out.println(a2); // Advanced.a_static.d6_singleInstance.A@b4c966a}
}
1.7.1.3 單例模式的應(yīng)用場(chǎng)景和好處
  • Runtime 類
    • 程序的運(yùn)行環(huán)境,Java 程序執(zhí)行的時(shí)候只有一套運(yùn)行環(huán)境,因此 Runtime 它也只需要一個(gè)對(duì)象就可以代表你那個(gè)唯一的運(yùn)行環(huán)境
  • 任務(wù)管理器
    • 無(wú)論啟動(dòng)多少次任務(wù)管理器,其窗口對(duì)象始終只有一個(gè)
1.7.1.4 單例設(shè)計(jì)模式的實(shí)現(xiàn)方式很多

總結(jié)
  1. 什么是設(shè)計(jì)模式,設(shè)計(jì)模式主要學(xué)什么?單例模式解決了上面問(wèn)題
  • 設(shè)計(jì)模式就是具體問(wèn)題的最優(yōu)解決方案
  • 解決了什么問(wèn)題?怎么寫?
  • 確保一個(gè)類只有一個(gè)對(duì)象
  1. 單例怎么寫?餓漢式單例的特點(diǎn)是什么?
  • 把類的構(gòu)造器私有;定義一個(gè)類變量存儲(chǔ)類的一個(gè)對(duì)象;提供一個(gè)類方法返回對(duì)象
  • 在獲取類對(duì)象時(shí),對(duì)象已經(jīng)創(chuàng)建好了
  1. 單例有啥應(yīng)用場(chǎng)景,有啥好處?
  • 任務(wù)管理器對(duì)象、獲取運(yùn)行時(shí)對(duì)象
  • 在這些業(yè)務(wù)場(chǎng)景下,使用單例模式,可以避免浪費(fèi)內(nèi)存

1.7.2 懶漢式單例設(shè)計(jì)模式
  • 拿對(duì)象時(shí),才開始創(chuàng)建對(duì)象

寫法

  • 把類的構(gòu)造器私有
  • 定義一個(gè)類變量用于存儲(chǔ)對(duì)象
  • 提供一個(gè)類方法,保證返回的是同一個(gè)對(duì)象

代碼實(shí)現(xiàn)

  • B.java
package Advanced.a_static.d6_singleInstance;public class B {// 2. 定義一個(gè)類變量,用于存儲(chǔ)這個(gè)類的一個(gè)對(duì)象private static B b;// 1. 把類的構(gòu)造器私有private B() {}// 3. 定義一個(gè)類方法,這個(gè)方法要保證第一次調(diào)用時(shí)才創(chuàng)建一個(gè)對(duì)象,后面調(diào)用時(shí)都會(huì)用這同一個(gè)對(duì)象返回public static B getInstance() {if (b == null) {System.out.println("第一次創(chuàng)建對(duì)象~~~");b = new B();}return b;}
}
  • Test2.java
package Advanced.a_static.d6_singleInstance;/*** 目標(biāo):掌握懶漢式單例的寫法*/public class Test2 {public static void main(String[] args) {B b1 = B.getInstance(); // 第一次拿對(duì)象B b2 = B.getInstance();System.out.println(b1 == b2); // true}
}

2. 面向?qū)ο笕筇卣髦?#xff1a;繼承

2.1 繼承的快速入門

2.1.1 認(rèn)識(shí)繼承、特點(diǎn)
2.1.1.1 什么是繼承?
  • Java 中提供了一個(gè)關(guān)鍵字 extends,用這個(gè)關(guān)鍵字,可以讓一個(gè)類和另一個(gè)類建立起父子關(guān)系
public class B extends A {}
  • A 類稱之為父類(基類或超類)
  • B 類稱之為子類(派生類)

2.1.1.2 繼承的特點(diǎn)
  • 子類能繼承父類的非私有成員(成員變量、成員方法)

繼承后對(duì)象的創(chuàng)建

  • 子類的對(duì)象是由子類、父類共同完成的
2.1.1.3 繼承的執(zhí)行原理

  • 子類對(duì)象實(shí)際上是由子父類這兩張?jiān)O(shè)計(jì)圖共同創(chuàng)建出來(lái)的
代碼實(shí)現(xiàn)
  • A.java
package Advanced.b_extends.d7_extends;// 父類
public class A {// 公開成員public int i;public void print1() {System.out.println("===print1===");}// 私有成員private int j;private void print2() {System.out.println("===print2===");}
}
  • B.java
package Advanced.b_extends.d7_extends;// 子類
public class B extends A {// 子類是可以繼承父類的非私有成員public void print3() {System.out.println(i);print1();//        System.out.println(j); // 報(bào)錯(cuò)
//        print2(); // 報(bào)錯(cuò)}
}
  • Test.java
package Advanced.b_extends.d7_extends;public class Test {public static void main(String[] args) {// 目標(biāo):認(rèn)識(shí)繼承、掌握繼承的特點(diǎn)B b = new B();System.out.println(b.i); // 0
//        System.out.println(b.j); // 報(bào)錯(cuò)b.print1();
//        b.print2(); // 報(bào)錯(cuò)b.print3();}
}
總結(jié)
  1. 什么是繼承?繼承后有啥特點(diǎn)?
  • 繼承就是用 extends 關(guān)鍵字,讓一個(gè)類和另一個(gè)類建立起一種父子關(guān)系
  • 子類可以繼承父類非私有的成員
  1. 帶繼承關(guān)系的類,Java 會(huì)怎么創(chuàng)建它的對(duì)象?對(duì)象創(chuàng)建出來(lái)后,可以直接訪問(wèn)哪些成員?
  • 帶繼承關(guān)系的類,Java 會(huì)用類和其父類,這多張?jiān)O(shè)計(jì)圖來(lái)一起創(chuàng)建類的對(duì)象
  • 對(duì)象能直接訪問(wèn)什么成員,是由子父類這多張?jiān)O(shè)計(jì)圖共同決定的,這多張?jiān)O(shè)計(jì)圖對(duì)外暴露了什么成員,對(duì)象就可以訪問(wèn)什么成員

2.1.2 繼承的好處、應(yīng)用場(chǎng)景
2.1.2.1 使用繼承有啥好處?
  • 減少重復(fù)代碼的編寫

需求:
Feng 的員工管理系統(tǒng)種
需要處理講師、咨詢師的數(shù)據(jù)
講師的數(shù)據(jù)有:姓名、具備的技能
咨詢師的數(shù)據(jù)有:姓名、解答問(wèn)題的總?cè)藬?shù)

代碼實(shí)現(xiàn)

  • People.java
package Advanced.b_extends.d8_extends_application;public class People {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
  • Teacher.java
package Advanced.b_extends.d8_extends_application;public class Teacher extends People {private String skill;public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}public void printInfo() {System.out.println(getName() + "具備的技能" + skill);}
}
  • Test.java
package Advanced.b_extends.d8_extends_application;public class Test {public static void main(String[] args) {// 目標(biāo):搞清楚繼承的好處Teacher t = new Teacher();t.setName("張三");t.setSkill("Java、Spring");System.out.println(t.getName()); // 張三System.out.println(t.getSkill()); // Java、Springt.printInfo(); // 張三具備的技能Java、Spring}
}
總結(jié)
  1. 使用繼承有啥好處?
  • 減少了重復(fù)代碼的編寫,提高了代碼的復(fù)用性

2.2 繼承相關(guān)的注意事項(xiàng)

2.2.1 權(quán)限修飾符
2.2.1.1 什么是權(quán)限修飾符?
  • 就是用來(lái)限制類中的成員(成員變量、成員方法、構(gòu)造器、代碼塊…)能夠被訪問(wèn)的范圍
2.2.1.2 權(quán)限修飾符有幾種?各自的作用是什么?
修飾符在本類中同一個(gè)包下的其他類里任意包下的子類里任意包下的任意類里
private
缺省
protected
public

private < 缺省 < protected < public

代碼演示
  • d9_modifer.Fu.java
package Advanced.b_extends.d9_modifer;public class Fu {// 1. 私有:只能在本類中訪問(wèn)private void privateMethod(){System.out.println("===private===");}// 2. 缺省:本類,同一個(gè)包下的類void method(){System.out.println("===缺省===");}// 3. protected:本類,同一個(gè)包下的類,任意包下的子類protected void protectedMethod(){System.out.println("===protected===");}// 4. public:本類,同一個(gè)包下的類,任意包下的子類,任意包下的任意類public void publicMethod(){System.out.println("===public===");}public void test(){privateMethod();method();privateMethod();publicMethod();}
}
  • d9_modifer.Demo.java
package Advanced.b_extends.d9_modifer;public class Demo {public static void main(String[] args) {// 目標(biāo):掌握不同權(quán)限修飾符的作用Fu f = new Fu();
//        f.privateMethod(); // 報(bào)錯(cuò)f.method();f.protectedMethod();f.publicMethod();}
}
  • d10_modifer.Zi.java
package Advanced.b_extends.d10_modifer;import Advanced.b_extends.d9_modifer.Fu;public class Zi extends Fu {public void test() {
//        privateMethod(); // 報(bào)錯(cuò)
//        method(); // 報(bào)錯(cuò)protectedMethod();publicMethod();}
}
  • d10_modifer.Demo2.java
package Advanced.b_extends.d10_modifer;import Advanced.b_extends.d9_modifer.Fu;public class Demo2 {public static void main(String[] args) {Fu f = new Fu();
//        f.privateMethod(); // 報(bào)錯(cuò)
//        f.method(); // 報(bào)錯(cuò)
//        f.protectedMethod(); // 報(bào)錯(cuò)f.publicMethod();Zi zi = new Zi();
//        zi.protectedMethod(); // 報(bào)錯(cuò)}
}

2.2.2 單繼承、Object 類
2.2.2.1 單繼承

Java 是單繼承的,Java 中的類不支持多繼承,但是支持多層繼承

單繼承:指的是一個(gè)類只能繼承一個(gè)直接父類

2.2.2.2 為何 Java 中的類不支持多繼承

反證法:

  • 假設(shè) Java 中的類支持多繼承,現(xiàn)在有兩個(gè)類,一個(gè) A 中有一個(gè) method 方法里面打印 “aaa”,一個(gè) B 中有一個(gè) method 方法里面打印 “bbb”
  • 再定義一個(gè) C 類同時(shí)繼承 A 和 B,那么 C 調(diào)用 method 方法時(shí)就不知道調(diào)用誰(shuí)的方法了
2.2.2.3 Object 類
  • Object 類是 Java 所有類的祖宗類。我們寫的任意一個(gè)類,其實(shí)都是 Object 的子類或者子孫類
代碼演示
package Advanced.b_extends.d11_extends_feature;public class Test {public static void main(String[] args) {// 目標(biāo):掌握繼承的兩個(gè)注意事項(xiàng)// 1. Java是單繼承的:一個(gè)類只能繼承一個(gè)直接父類;Java中的類不支持多繼承,但支持多層繼承// 2. Object類是Java中所有類的祖宗A a = new A();B b = new B();}
}class A {
} // extends Object{}class B extends A {
}//class C extends B, A{} // 報(bào)錯(cuò)class D extends B {
}
總結(jié)
  1. 繼承相關(guān)的兩個(gè)注意事項(xiàng)?
  • Java 是單繼承的:一個(gè)類只能繼承一個(gè)直接父類;Java 中的類不支持多繼承,但是支持多層繼承

  • Object 類是 Java 中所有類的祖宗


2.2.3 方法重寫
2.2.3.1 認(rèn)識(shí)方法重寫

什么是方法重寫?

  • 當(dāng)子類覺(jué)得父類中的某個(gè)方法不好用,或者無(wú)法滿足自己的需求時(shí),子類可以重寫一個(gè)方法名稱、參數(shù)列表一樣的方法,去覆蓋父類的這個(gè)方法,這就是方法重寫
  • 注意:重寫后,方法的訪問(wèn),Java 會(huì)遵循就近原則

方法重寫的其他注意事項(xiàng)

  • 重寫小技巧:使用 Override 注解,他可以指定 Java 編譯器,檢查我們方法重寫的格式是否正確,代碼可讀性也會(huì)更好
  • 子類重寫父類方法時(shí),訪問(wèn)權(quán)限必須大于或者等于父類該方法的權(quán)限(public > protected > 缺省
  • 重寫的方法返回值類型,必須與被重寫方法的返回值類型一樣,或者范圍更小
  • 私有方法、靜態(tài)方法不能被重寫,如果重寫會(huì)報(bào)錯(cuò)的

代碼演示

  • A.java
package Advanced.b_extends.d12_extends_override;public class A {public void print1() {System.out.println("111");}public void print2(int a, int b) {System.out.println("111111");}
}
  • B.java
package Advanced.b_extends.d12_extends_override;public class B extends A {// 方法重寫@Override // 安全,可讀性好public void print1() {System.out.println("666");}// 方法重寫@Overridepublic void print2(int a, int b) {System.out.println("666666");}
}
  • Test.java
package Advanced.b_extends.d12_extends_override;public class Test {public static void main(String[] args) {// 目標(biāo):認(rèn)識(shí)方法重寫,掌握方法重寫的常見(jiàn)應(yīng)用場(chǎng)景B b = new B();b.print1(); // 666b.print2(2, 3); // 666666}
}
2.2.3.2 方法重寫的應(yīng)用場(chǎng)景
  • 子類重寫 Object 類的 toString() 方法,以便返回對(duì)象的內(nèi)容

代碼演示

  • Student.java
package Advanced.b_extends.d12_extends_override;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  • Test.java
package Advanced.b_extends.d12_extends_override;import java.util.ArrayList;public class Test {public static void main(String[] args) {// 目標(biāo):認(rèn)識(shí)方法重寫,掌握方法重寫的常見(jiàn)應(yīng)用場(chǎng)景B b = new B();b.print1(); // 666b.print2(2, 3); // 666666System.out.println("----------------------------");Student s = new Student("張三", 19);System.out.println(s.toString()); // Advanced.b_extends.d12_extends_override.Student@4e50df2e   Student{name=張三,age=19}System.out.println(s); // Advanced.b_extends.d12_extends_override.Student@4e50df2e   Student{name=張三,age=19}ArrayList list = new ArrayList();list.add("java");System.out.println(list); // [java]   說(shuō)明ArrayList類中把Object類里面的toString方法進(jìn)行了重寫}
}
總結(jié)
  1. 方法重寫是什么?
  • 子類寫了一個(gè)方法名稱、形參列表與父類某個(gè)方法一樣的方法去覆蓋父類的該方法
  1. 重寫方法有哪些注意事項(xiàng)?
  • 建議加上:@Override 注解,可以校驗(yàn)重寫是否正確,同時(shí)可讀性好
  • 子類重寫父類方法時(shí),訪問(wèn)權(quán)限必須大于或者等于父類被重寫的方法的權(quán)限
  • 重寫的方法返回值類型,必須與被重寫方法的返回值類型一樣,或者范圍更小
  • 私有方法、靜態(tài)方法不能被重寫
  1. 方法重寫有啥應(yīng)用場(chǎng)景?
  • 當(dāng)子類覺(jué)得父類的方法不好用,或者不滿足自己的需求時(shí),就可以用方法重寫

2.2.4 子類中訪問(wèn)其他成員的特點(diǎn)
  1. 在子類方法中訪問(wèn)其他成員(成員變量、成員方法),是依照就近原則
  • 先子類局部范圍找
  • 然后子類成員范圍找
  • 然后父類成員范圍找,如果父類范圍還沒(méi)有找到則報(bào)錯(cuò)
  1. 如果父類中,出現(xiàn)了重名的成員,會(huì)優(yōu)先使用子類的,如果此時(shí)一定要在子類中使用父類的怎么辦?
  • 可以通過(guò) super 關(guān)鍵字,指定訪問(wèn)父類的成員:super.父類成員變量/父類成員方法

代碼演示

  • F.java
package Advanced.b_extends.d13_extends_visit;public class F {String name = "父類名字";public void print1() {System.out.println("===父類的print1方法執(zhí)行===");}
}
  • Z.java
package Advanced.b_extends.d13_extends_visit;public class Z extends F {String name = "子類名稱";public void showName() {String name = "局部名稱";System.out.println(name);System.out.println(this.name);System.out.println(super.name);}@Overridepublic void print1() {System.out.println("===子類的print1方法執(zhí)行了===");}public void showMethod() {print1(); // 子類的super.print1(); // 父類的}
}
  • Test.java
package Advanced.b_extends.d13_extends_visit;public class Test {public static void main(String[] args) {// 目標(biāo):掌握子類中訪問(wèn)其他成員的特點(diǎn):就近原則Z z = new Z();z.showName(); // 局部名稱 子類名稱 父類名字z.showMethod(); // ===子類的print1方法執(zhí)行了=== ===父類的print1方法執(zhí)行===}
}

2.2.5 子類構(gòu)造器的特點(diǎn)
2.2.5.1 認(rèn)識(shí)子類構(gòu)造器的特點(diǎn)

子類構(gòu)造器的特點(diǎn):

  • 子類的全部構(gòu)造器,都會(huì)先調(diào)用父類的構(gòu)造器,再執(zhí)行自己

子類構(gòu)造器是如何實(shí)現(xiàn)調(diào)用父類構(gòu)造器的:

  • 默認(rèn)情況下,子類全部構(gòu)造器的第一行代碼都是 super(); (寫不寫都有),它會(huì)調(diào)用父類的無(wú)參數(shù)構(gòu)造器
  • 如果父類沒(méi)有無(wú)參數(shù)構(gòu)造器,則我們必須在子類構(gòu)造器的第一行手寫 super(...); ,指定去調(diào)用父類的有參數(shù)構(gòu)造器
代碼演示
package Advanced.b_extends.d14_extends_constructor;class F {
//    public F() {
//        System.out.println("===父類F的無(wú)參數(shù)構(gòu)造器執(zhí)行了===");
//    }public F(String name, int age) {}
}class Z extends F {public Z() {
//        super(); // 默認(rèn)存在的super("張三",17);System.out.println("===子類Z的無(wú)參數(shù)構(gòu)造器執(zhí)行了===");}public Z(String name) {
//        super(); // 默認(rèn)存在的super("張三",17);System.out.println("===子類Z的有參數(shù)構(gòu)造器執(zhí)行了===");}
}public class Test {public static void main(String[] args) {// 目標(biāo):先認(rèn)識(shí)子類構(gòu)造器的特點(diǎn),再掌握這個(gè)特點(diǎn)的常見(jiàn)應(yīng)用場(chǎng)景Z z = new Z(); // ===父類F的無(wú)參數(shù)構(gòu)造器執(zhí)行了=== ===子類Z的無(wú)參數(shù)構(gòu)造器執(zhí)行了===Z z2 = new Z("張三"); // ===父類F的無(wú)參數(shù)構(gòu)造器執(zhí)行了=== ===子類Z的有參數(shù)構(gòu)造器執(zhí)行了===}
}
2.2.5.1 常見(jiàn)的應(yīng)用場(chǎng)景

搞清楚子類構(gòu)造器為什么要調(diào)用父類的構(gòu)造器,有啥應(yīng)用場(chǎng)景?

  • 在繼承情況下,由于處理對(duì)象數(shù)據(jù)的構(gòu)造器拆到了多個(gè)類里面去了,所以對(duì)象要通過(guò)調(diào)用這多個(gè)構(gòu)造器才能把對(duì)象的數(shù)據(jù)處理完整

運(yùn)行過(guò)程

  • 子類構(gòu)造器可以通過(guò)父類構(gòu)造器,把對(duì)象中包含父類這部分的數(shù)據(jù)先初始化賦值,再回來(lái)把對(duì)象里包含子類這部分的數(shù)據(jù)也進(jìn)行初始化賦值
代碼演示
package Advanced.b_extends.d14_extends_constructor;public class Test2 {public static void main(String[] args) {// 目標(biāo):搞清楚子類構(gòu)造器為什么要調(diào)用父類的構(gòu)造器,有啥應(yīng)用場(chǎng)景Teacher t = new Teacher("李四", 36, "Java");System.out.println(t.getName()); // 李四System.out.println(t.getAge()); // 36System.out.println(t.getSkill()); // Java}
}class Teacher extends People {private String skill;public Teacher(String name, int age, String skill) {super(name, age);this.skill = skill;}public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}
}class People {private String name;private int age;public People() {}public People(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
補(bǔ)充知識(shí):this(…) 調(diào)用兄弟構(gòu)造器
  • 任意類的構(gòu)造器中,是可以通過(guò) this(...) 去調(diào)用該類的其他構(gòu)造器的

this(…) 和 super(…) 使用時(shí)的注意事項(xiàng):

  • this(…)、super(…) 都只能放在構(gòu)造器的第一行,因此,有了 this(…) 就不能寫 super(…) 了,反之亦然

代碼演示

package Advanced.b_extends.d14_extends_constructor;public class Test3 {public static void main(String[] args) {// 目標(biāo):掌握在類的構(gòu)造器中,通過(guò)this(...)調(diào)用兄弟構(gòu)造器的作用Student s1 = new Student("李四", 26, "家里蹲大學(xué)");// 需求:如果學(xué)生沒(méi)有填寫學(xué)校,那么學(xué)校默認(rèn)就是FengStudent s2 = new Student("張三", 28);System.out.println(s2.getName()); // 張三System.out.println(s2.getAge()); // 28System.out.println(s2.getSchoolName()); // Feng}
}class Student {private String name;private int age;private String schoolName;public Student() {}public Student(String name, int age) {this(name, age, "Feng");}public Student(String name, int age, String schoolName) {this.name = name;this.age = age;this.schoolName = schoolName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}
}

2.2.6 注意事項(xiàng)小結(jié)
  1. 子類構(gòu)造器有啥特點(diǎn)?
  • 子類中的全部構(gòu)造器,都必須先調(diào)用父類的構(gòu)造器,再執(zhí)行自己
  1. super(…) 調(diào)用父類有參數(shù)構(gòu)造器的常見(jiàn)場(chǎng)景是什么?
  • 為對(duì)象中包含父類這部分的成員變量進(jìn)行賦值
  1. this(…) 的作用是什么?
  • 在構(gòu)造器中調(diào)用本類的其他構(gòu)造器
  1. this(…) 和 super(…) 的使用需要注意什么?
  • 都必須放在構(gòu)造器的第一行

3. 面向?qū)ο蟮娜筇卣髦?#xff1a;多態(tài)

3.1 認(rèn)識(shí)多態(tài)

3.1.1 什么是多態(tài)?
  • 多態(tài)是在繼承/實(shí)現(xiàn)情況下的一種現(xiàn)象,表現(xiàn)為:對(duì)象多態(tài)、行為多態(tài)
3.1.2 多態(tài)的具體代碼實(shí)現(xiàn)
People p1 = new Student();
p1.run();People p2 = new Teacher();
p2.run();
3.1.3 多態(tài)的前提
  • 繼承/實(shí)現(xiàn)關(guān)系;存在父類引用子類對(duì)象;存在方法重寫
3.1.4 多態(tài)的一個(gè)注意事項(xiàng)
  • 多態(tài)是對(duì)象、行為的多態(tài),Java 中的屬性(成員變量)不談多態(tài)
代碼演示
  • People.java
package Advanced.c_polymorphism.d1_polymorphism;// 父類
public class People {public String name = "父類People的名稱";public void run() {System.out.println("人可以跑~~~");}
}
  • Student.java
package Advanced.c_polymorphism.d1_polymorphism;public class Student extends People {public String name = "子類Student的名稱";@Overridepublic void run() {System.out.println("學(xué)生跑得賊快~~~");}
}
  • Teacher.java
package Advanced.c_polymorphism.d1_polymorphism;public class Teacher extends People {public String name = "子類Teacher的名稱";@Overridepublic void run() {System.out.println("老師跑的氣喘吁吁~~~");}
}
  • Test.java
package Advanced.c_polymorphism.d1_polymorphism;public class Test {public static void main(String[] args) {// 目標(biāo):認(rèn)識(shí)多態(tài):對(duì)象多態(tài)、行為多態(tài)// 1. 對(duì)象多態(tài)People p1 = new Teacher();// 行為多態(tài):識(shí)別技巧:編譯看左邊,運(yùn)行看右邊p1.run(); // 老師跑的氣喘吁吁~~~// 注意:對(duì)于變量:編譯看左邊,運(yùn)行看左邊System.out.println(p1.name); // 父類People的名稱People p2 = new Student();// 行為多態(tài):識(shí)別技巧:編譯看左邊,運(yùn)行看右邊p2.run(); // 學(xué)生跑得賊快~~~System.out.println(p2.name); // 父類People的名稱}
}

3.2 使用多態(tài)的好處

3.2.1 使用多態(tài)的好處
  • 在多態(tài)形勢(shì)下,右邊對(duì)象是解耦合的,更便于擴(kuò)展和維護(hù)

    • 解耦合:比如說(shuō)我們?cè)陂_發(fā)系統(tǒng)時(shí),希望把這個(gè)系統(tǒng)中的每個(gè)模塊拆分成一個(gè)一個(gè)的服務(wù),可以隨時(shí)的對(duì)接,這樣更容易擴(kuò)展和維護(hù),這就是解耦合
  • 定義方法時(shí),使用父類類型的形參,可以接收一切子類對(duì)象,擴(kuò)展性更強(qiáng)、更便利

3.2.2 多態(tài)下會(huì)產(chǎn)生的一個(gè)問(wèn)題,怎么解決?
  • 多態(tài)下不能使用子類的獨(dú)有功能
代碼演示
  • People.java
package Advanced.c_polymorphism.d2_polymorphism;// 父類
public class People {public String name = "父類People的名稱";public void run() {System.out.println("人可以跑~~~");}
}
  • Student.java
package Advanced.c_polymorphism.d2_polymorphism;public class Student extends People {public String name = "子類Student的名稱";@Overridepublic void run() {System.out.println("學(xué)生跑得賊快~~~");}public void test() {System.out.println("學(xué)生需要考試~~~");}
}
  • Teacher.java
package Advanced.c_polymorphism.d2_polymorphism;public class Teacher extends People {public String name = "子類Teacher的名稱";@Overridepublic void run() {System.out.println("老師跑的氣喘吁吁~~~");}public void test() {System.out.println("老師需要教知識(shí)~~~");}
}
  • Test.java
package Advanced.c_polymorphism.d2_polymorphism;public class Test {public static void main(String[] args) {// 目標(biāo):理解多態(tài)的好處// 好處1:可以實(shí)現(xiàn)解耦合,右邊對(duì)象可以隨時(shí)切換,后續(xù)業(yè)務(wù)隨之改變People p1 = new Student();p1.run();
//        p1.test(); // 多態(tài)下存在的問(wèn)題,無(wú)法直接調(diào)用子類的獨(dú)有功能Student s = new Student();go(s);Teacher t = new Teacher();go(s);}// 好處2:可以使用父類類型的變量作為形參,可以接收一切子類對(duì)象public static void go(People p) {}
}
總結(jié)
  1. 使用多態(tài)有什么好處?存在什么問(wèn)題?
  • 可以解耦合,擴(kuò)展性更強(qiáng);使用父類類型的變量作為方法的形參時(shí),可以接收一切子類對(duì)象
  • 多態(tài)下不能直接調(diào)用子類的獨(dú)有方法

3.3 多態(tài)下的類型轉(zhuǎn)換問(wèn)題

3.3.1 類型轉(zhuǎn)換
  • 自動(dòng)類型轉(zhuǎn)換:父類 變量名 = new 子類();

    • eg:People p = new Teacher();
  • 強(qiáng)制類型轉(zhuǎn)換:子類 變量名 = (子類) 父類變量

    • eg:Teacher t = (Teacher) p;
3.3.2 強(qiáng)制類型轉(zhuǎn)換的一個(gè)注意事項(xiàng)
  • 存在繼承/實(shí)現(xiàn)關(guān)系就可以在編譯階段進(jìn)行強(qiáng)制類型轉(zhuǎn)換,編譯階段不會(huì)報(bào)錯(cuò)
  • 運(yùn)行時(shí),如果發(fā)現(xiàn)對(duì)象的真實(shí)類型與強(qiáng)轉(zhuǎn)后的類型不同,就會(huì)報(bào)類型轉(zhuǎn)換異常(ClassCastException)的錯(cuò)誤出來(lái)
People p = new Teahcer();Student s = (Student) p; // java.lang.ClassCastException
3.3.3 強(qiáng)轉(zhuǎn)前,Java 建議:
  • 使用 instanceof 關(guān)鍵字,判斷當(dāng)前對(duì)象的真實(shí)類型,再進(jìn)行強(qiáng)轉(zhuǎn)
p instanceof Student
代碼演示
  • People.java
package Advanced.c_polymorphism.d2_polymorphism;// 父類
public class People {public String name = "父類People的名稱";public void run() {System.out.println("人可以跑~~~");}
}
  • Student.java
package Advanced.c_polymorphism.d2_polymorphism;public class Student extends People {public String name = "子類Student的名稱";@Overridepublic void run() {System.out.println("學(xué)生跑得賊快~~~");}public void test() {System.out.println("學(xué)生需要考試~~~");}
}
  • Teacher.java
package Advanced.c_polymorphism.d2_polymorphism;public class Teacher extends People {public String name = "子類Teacher的名稱";@Overridepublic void run() {System.out.println("老師跑的氣喘吁吁~~~");}public void teach() {System.out.println("老師需要教知識(shí)~~~");}
}
  • Test.java
package Advanced.c_polymorphism.d2_polymorphism;public class Test {public static void main(String[] args) {// 目標(biāo):理解多態(tài)的好處// 好處1:可以實(shí)現(xiàn)解耦合,右邊對(duì)象可以隨時(shí)切換,后續(xù)業(yè)務(wù)隨之改變People p1 = new Student();p1.run();
//        p1.test(); // 多態(tài)下存在的問(wèn)題,無(wú)法直接調(diào)用子類的獨(dú)有功能// 強(qiáng)制類型轉(zhuǎn)換Student s1 = (Student) p1;s1.test(); // 學(xué)生需要考試~~~// 強(qiáng)制類型轉(zhuǎn)換可能存在的問(wèn)題,編譯階段有繼續(xù)或者實(shí)現(xiàn)關(guān)系就可以強(qiáng)制轉(zhuǎn)換,但是運(yùn)行時(shí)可能出現(xiàn)類型轉(zhuǎn)換異常
//        Teacher t1 = (Teacher) p1; // 運(yùn)行時(shí)出現(xiàn)了:ClassCastExceptionif (p1 instanceof Student) {Student s2 = (Student) p1;s2.test(); // 學(xué)生需要考試~~~} else {Teacher t2 = (Teacher) p1;t2.teach();}System.out.println("------------------------------");// 好處2:可以使用父類類型的變量作為形參,可以接收一切子類對(duì)象Student s = new Student();go(s); // 學(xué)生跑得賊快~~~ 學(xué)生需要考試~~~Teacher t = new Teacher();go(t); // 老師跑的氣喘吁吁~~~ 老師需要教知識(shí)~~~}// 好處2:可以使用父類類型的變量作為形參,可以接收一切子類對(duì)象public static void go(People p) {p.run();if (p instanceof Student) {Student s2 = (Student) p;s2.test();} else if (p instanceof Teacher) {Teacher t2 = (Teacher) p;t2.teach();}}
}
總結(jié)
  1. 類型轉(zhuǎn)換有幾種形式?能解決什么問(wèn)題?
  • 自動(dòng)類型轉(zhuǎn)換、強(qiáng)制類型轉(zhuǎn)換
  • 可以把對(duì)象轉(zhuǎn)換成其真正的類型,從而解決了多態(tài)下不能調(diào)用子類獨(dú)有方法的問(wèn)題
  1. 強(qiáng)制類型轉(zhuǎn)換需要注意什么?
  • 存在繼承/實(shí)現(xiàn)時(shí),就可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換,編譯階段不會(huì)報(bào)錯(cuò)
  • 但是,運(yùn)行時(shí),如果發(fā)現(xiàn)對(duì)象的真是類型與強(qiáng)轉(zhuǎn)后的類型不同會(huì)報(bào)錯(cuò)(ClassCastException)
  1. 強(qiáng)制類型轉(zhuǎn)換前,Java 建議我們做什么事情?
  • 使用 instanceof 判斷當(dāng)前對(duì)象的真是類型:對(duì)象 instanceof 類型

http://aloenet.com.cn/news/35077.html

相關(guān)文章:

  • 廣州專業(yè)的網(wǎng)站建設(shè)青島建站seo公司
  • 想象力做網(wǎng)站十大免費(fèi)最虧的免費(fèi)app
  • 佛山網(wǎng)站建設(shè)百度一下首頁(yè)
  • cpa個(gè)人網(wǎng)站怎么做快速seo排名優(yōu)化
  • 網(wǎng)站建設(shè)公司做網(wǎng)站要多少費(fèi)用農(nóng)產(chǎn)品品牌推廣方案
  • 微信開放平臺(tái)登錄好口碑的關(guān)鍵詞優(yōu)化
  • 網(wǎng)站建設(shè) 中企動(dòng)力南昌產(chǎn)品如何推廣
  • 西安免費(fèi)做網(wǎng)站哪家好大連seo外包平臺(tái)
  • 分類信息網(wǎng)站平臺(tái)的推廣新聞20字摘抄大全
  • 張家港保稅區(qū)建設(shè)規(guī)劃局網(wǎng)站湖南優(yōu)化公司
  • 做精神科網(wǎng)站專業(yè)代寫軟文
  • 電商網(wǎng)站seoseo管理系統(tǒng)培訓(xùn)
  • 南京做網(wǎng)站公司seo排名優(yōu)化推薦
  • wordpress好看分頁(yè)北京做網(wǎng)絡(luò)優(yōu)化的公司
  • 新聞網(wǎng)站開發(fā)書籍北京seo公司
  • 做網(wǎng)站上傳服務(wù)器嗎優(yōu)化網(wǎng)站教程
  • 海南高端網(wǎng)站建設(shè)直接打開百度
  • 淮南 搭建一個(gè)企業(yè)展示網(wǎng)站cba最新排名
  • 電腦裝機(jī)網(wǎng)站網(wǎng)站優(yōu)化的方法有哪些
  • 營(yíng)銷型網(wǎng)站=企業(yè)登記代理網(wǎng)站關(guān)鍵詞優(yōu)化方法
  • 做網(wǎng)站那個(gè)平臺(tái)個(gè)人怎么做免費(fèi)百度推廣
  • wordpress 導(dǎo)入幻燈片優(yōu)化網(wǎng)站建設(shè)
  • 杭州設(shè)計(jì)網(wǎng)站最好的公司東莞seo建站排名
  • 網(wǎng)絡(luò)服務(wù)合同糾紛定義簡(jiǎn)述影響關(guān)鍵詞優(yōu)化的因素
  • 海南做房地產(chǎn)網(wǎng)站的網(wǎng)絡(luò)公司seo公司官網(wǎng)
  • 制作官網(wǎng)需要什么條件茶葉seo網(wǎng)站推廣與優(yōu)化方案
  • 網(wǎng)站制作手機(jī)網(wǎng)站成人培訓(xùn)班有哪些課程
  • 網(wǎng)站制作價(jià)格和流程云浮新增確診病例30例
  • 建網(wǎng)站的外包公司百度推廣怎么做步驟
  • wordpress花生殼lamp南京百度seo代理