JavaSE繼承基本使用

      網友投稿 560 2022-05-29

      1. 為什么需要繼承

      2. 繼承基本介紹和示意圖

      3. 繼承的基本語法

      4. 快速入門案例

      5. 繼承給編程帶來的便利

      6. 繼承的深入討論/細節問題

      7. 繼承的本質分析(重要)

      8. 練習

      1. 為什么需要繼承

      2. 繼承基本介紹和示意圖

      3. 繼承的基本語法

      4. 快速入門案例

      5. 繼承給編程帶來的便利

      6. 繼承的深入討論/細節問題

      7. 繼承的本質分析(重要)

      8. 練習

      1. 為什么需要繼承

      一個小問題,還是看個程序[com.xdr630.extend_包: Extends01.java],提出代碼復用的問題。

      編寫了兩個類,一個是Pupil類(小學生),一個是Graduate(大學畢業生).

      package com.xdr630.extends_; public class Pupil { public String name; public int age; private double score; public void setScore(double score) { this.score = score; } public void testing(){ System.out.println("小學生 " + name + " 正在考小學數學.."); } public void showInfo(){ System.out.println("學生名 " + name + " 年齡" + age + " 成績" + score); } }

      package com.xdr630.extends_; public class Graduate { public String name; public int age; private double score; public void setScore(double score) { this.score = score; } public void testing(){ System.out.println("大學生 " + name + " 正在考大學數學.."); } public void showInfo(){ System.out.println("學生名 " + name + " 年齡" + age + " 成績" + score); } }

      package com.xdr630.extends_; public class Extends01 { public static void main(String[] args) { Pupil pupil = new Pupil(); pupil.name = "小明"; pupil.age = 10; pupil.setScore(60); pupil.showInfo(); System.out.println("====================="); Graduate graduate = new Graduate(); graduate.name = "大明"; graduate.age = 23; graduate.setScore(100); graduate.showInfo(); } }

      問題:兩個類的屬性和方法有很多是相同的,怎么辦?

      =>繼承(代碼復用性~)

      2. 繼承基本介紹和示意圖

      繼承可以解決代碼復用,讓我們的編程更加靠近人類思維.當多個類存在相同的屬性(變量)和方法時,可以從這些類中抽象出父類,在父類中定義這些相同的屬性和方法,所有的子類不需要重新定義這些屬性和方法,只需要通過 extends 來聲明繼承父類即可。

      繼承的示意圖

      3. 繼承的基本語法

      4. 快速入門案例

      對 Extends01.java 改進,使用繼承的方法,請注意體會使用繼承的好處

      package com.xdr630.extends_.improve_; // 父類,是 Pupil 和 Graduate 的父類 public class Student { //共有屬性 public String name; public int age; private double score; //共有方法 public void setScore(double score) { this.score = score; } }

      package com.xdr630.extends_.improve_; public class Pupil extends Student{ public void testing(){ System.out.println("小學生 " + name + " 正在考小學數學.."); } }

      package com.xdr630.extends_.improve_; public class Graduate extends Student{ public void testing(){ System.out.println("大學生 " + name + " 正在考大學數學.."); } }

      package com.xdr630.extends_.improve_; import com.xdr630.extends_.Graduate; import com.xdr630.extends_.Pupil; public class Extends01 { public static void main(String[] args) { com.xdr630.extends_.Pupil pupil = new Pupil(); pupil.name = "小明"; pupil.age = 10; pupil.setScore(60); pupil.showInfo(); System.out.println("====================="); com.xdr630.extends_.Graduate graduate = new Graduate(); graduate.name = "大明"; graduate.age = 23; graduate.setScore(100); graduate.showInfo(); } }

      5. 繼承給編程帶來的便利

      代碼的復用性提高了

      代碼的擴展性和維護性提高了

      6. 繼承的深入討論/細節問題

      子類繼承了所有的屬性和方法,非私有的屬性和方法可以在子類直接訪問, 但是私有屬性和方法不能在子類直接訪問,要通過父類提供公共的方法去訪問。

      Base 父類

      package com.xdr630.extends_; public class Base { //父類 //4個屬性 public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400; //父類提供一個public方法,返回了n4 public int getN4() { return n4; } public Base(){ System.out.println("Base()...."); } public void test100() { System.out.println("test100"); } protected void test200() { System.out.println("test200"); } void test300() { System.out.println("test300"); } private void test400() { System.out.println("test400"); } public void callTest400(){ test400(); } }

      Sub 子類

      package com.xdr630.extends_; //輸入ctrl + H 可以看到類的繼承關系 public class Sub extends Base { //子類 public Sub() {//無參構造器 System.out.println("子類Sub()構造器被調用...."); } public void sayOk() {//子類方法 //非私有的屬性和方法可以在子類直接訪問 //但是私有屬性和方法不能在子類直接訪問,要通過父類提供公共的方法去訪問 System.out.println(n1 + " " + n2 + " " + n3); test100(); test200(); test300(); //通過父類提供公共的方法去訪問 System.out.println("n4=" + getN4()); //通過父類提供公共的方法去訪問 callTest400(); } }

      ExtendsDetail 測試類

      package com.xdr630.extends_; public class ExtendsDetail { public static void main(String[] args) { Sub sub = new Sub(); sub.sayOk(); } }

      子類必須調用父類的構造器, 完成父類的初始化

      public class Base { //父類 public Base(){ System.out.println("父類Base()構造器被調用...."); } }

      public class Sub extends Base { //子類 public Sub() {//無參構造器 //默認調用父類的無參構造方法 //super(); System.out.println("子類Sub()構造器被調用...."); } }

      public class ExtendsDetail { public static void main(String[] args) { Sub sub = new Sub(); } }

      當創建子類對象時,不管使用子類的哪個構造器,默認情況下總會去調用父類的無參構造器,如果父類沒有提供無參構造器,則必須在子類的構造器中用 super 去指定使用父類的哪個構造器完成對父類的初始化工作,否則,編譯不會通過。

      當創建子類對象時,不管使用子類的哪個構造器,默認情況下總會去調用父類的無參構造器

      public class Base { //父類 public Base(){ System.out.println("父類Base()構造器被調用...."); } }

      public class Sub extends Base { //子類 public Sub() { System.out.println("子類Sub()構造器被調用...."); } public Sub(String name){ System.out.println("子類Sub(String name)構造器被調用...."); } }

      public class ExtendsDetail { public static void main(String[] args) { Sub sub = new Sub(); System.out.println("===第二個對象==="); Sub sub2 = new Sub("jack"); } }

      如果父類沒有提供無參構造器,則必須在子類的構造器中用 super 去指定使用父類的哪個構造器完成對父類的初始化工作,否則,編譯不會通過。

      public class Base { //父類 public Base(String name,int age){//有參構造器 System.out.println("父類Base(String name,int age)構造器被調用...."); } }

      public class Sub extends Base { //子類 public Sub(String name){ super("tom",30); System.out.println("子類Sub(String name)構造器被調用...."); } }

      public class ExtendsDetail { public static void main(String[] args) { System.out.println("===第一個對象==="); Sub sub = new Sub(); System.out.println("===第二個對象==="); Sub sub2 = new Sub("jack"); } }

      如果希望指定去調用父類的某個構造器,則顯式的調用一下 : super(參數列表)

      public class Base { //父類 public Base(String name,int age){//有參構造器 System.out.println("父類Base(String name,int age)構造器被調用...."); } }

      public class Sub extends Base { //子類 public Sub(String name){ super("tom",30); System.out.println("子類Sub(String name)構造器被調用...."); } }

      public class ExtendsDetail { public static void main(String[] args) { System.out.println("===第三個對象==="); Sub sub3 = new Sub("mike"); } }

      super 在使用時,必須放在構造器第一行(super 只能在構造器中使用)

      super() 和 this() 都只能放在構造器第一行,因此這兩個方法不能共存在一個構造器

      java 所有類都是 Object 類的子類, Object 是所有類的基類.

      父類構造器的調用不限于直接父類,將一直往上追溯直到 Object 類(頂級父類)

      子類最多只能繼承一個父類(指直接繼承),即 java 中是單繼承機制。

      思考:如何讓 A 類繼承 B 類和 C 類? 【A 繼承 B, B 繼承 C】

      不能濫用繼承,子類和父類之間必須滿足 is-a 的邏輯關系

      7. 繼承的本質分析(重要)

      看一個案例來分析當子類繼承父類,創建子類對象時,內存中到底發生了什么? 提示:當子類對象創建好后,建立查找的關系。

      public class ExtendsTheory { public static void main(String[] args) { Son son = new Son();//內存的布局 //-> 這時請大家注意,要按照查找關系來返回信息 //(1) 首先看子類是否有該屬性 //(2) 如果子類有這個屬性,并且可以訪問,則返回信息 //(3) 如果子類沒有這個屬性,就看父類有沒有這個屬性(如果父類有該屬性,并且可以訪問,就返回信息..) //(4) 如果父類沒有就按照(3)的規則,繼續找上級父類,直到Object... System.out.println(son.name);//返回就是大頭兒子 System.out.println(son.getAge());//返回的就是39 System.out.println(son.hobby);//返回的就是旅游 } } class GrandPa { //爺類 String name = "大頭爺爺"; String hobby = "旅游"; } class Father extends GrandPa {//父類 String name = "大頭爸爸"; private int age = 39; public int getAge() { return age; } } class Son extends Father { //子類 String name = "大頭兒子"; }

      子類創建的內存布局

      8. 練習

      【JavaSE】繼承基本使用

      案例 1 ExtendsExercise01.java

      public class ExtendsExercise01 { public static void main(String[] args) { B b = new B();//a , b name, b } } class A { A() { System.out.println("a"); } A(String name) { System.out.println("a name"); } } class B extends A { B() { this("abc"); System.out.println("b"); } B(String name) { //默認有 super(); System.out.println("b name"); } }

      main中:B b = new B(); 會輸出什么?

      案例 2 ExtendsExercise02.java

      public class ExtendsExercise02 { public static void main(String[] args) { C c = new C(); } } class A {//A類 public A() { System.out.println("我是A類"); } } class B extends A { //B類,繼承A類 public B() { System.out.println("我是B類的無參構造"); } public B(String name) { System.out.println(name + "我是B類的有參構造"); } } class C extends B { //C類,繼承 B類 public C() { this("hello"); System.out.println("我是c類的無參構造"); } public C(String name) { super("hahah"); System.out.println("我是c類的有參構造"); } }

      main方法中: C c = new C(); 輸出么內容?

      案例 3 ExtendsExercise03.java

      編寫 Computer 類,包含 CPU、內存、硬盤等屬性,getDetails 方法用于返回 Computer 的詳細信息

      編寫 PC 子類,繼承 Computer 類,添加特有屬性【品牌 brand】

      編寫 NotePad 子類,繼承 Computer 類,添加特有屬性【color】

      編寫 Test 類,在 main 方法中創建 PC 和 NotePad 對象,分別給對象中特有的屬性賦值,以及從 Computer 類繼承的屬性賦值,并使用方法并打印輸出信息

      public class Computer { private String cpu; private int memory; private int disk; public Computer(String cpu, int memory, int disk) { this.cpu = cpu; this.memory = memory; this.disk = disk; } //返回Computer信息 public String getDetails() { return "cpu=" + cpu + " memory=" + memory + " disk=" + disk; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public int getMemory() { return memory; } public void setMemory(int memory) { this.memory = memory; } public int getDisk() { return disk; } public void setDisk(int disk) { this.disk = disk; } }

      public class PC extends Computer{ private String brand; public PC(String cpu, int memory, int disk, String brand) { super(cpu, memory, disk); this.brand = brand; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public void printInfo() { System.out.println("PC信息="); System.out.println(getDetails() + " brand=" + brand); } }

      public class ExtendsExercise03 { public static void main(String[] args) { PC pc = new PC("intel", 16, 500, "IBM"); pc.printInfo(); } }

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何降低軟件復雜性?讓代碼更加精簡
      下一篇:Java 面向對象知識結構
      相關文章
      毛茸茸bbw亚洲人| 久久亚洲精品专区蓝色区| 色欲aⅴ亚洲情无码AV蜜桃| 亚洲国产成a人v在线| 亚洲一区二区电影| 亚洲gv白嫩小受在线观看| 亚洲色偷偷偷鲁综合| 亚洲精品高清在线| 亚洲第一页综合图片自拍| 国产偷国产偷亚洲高清在线| 亚洲AV色无码乱码在线观看| WWW国产亚洲精品久久麻豆| 久久亚洲精品成人无码| 国产精品日本亚洲777| 国产亚洲精品欧洲在线观看| 亚洲av无码国产精品色在线看不卡 | 亚洲六月丁香婷婷综合| 国产精品亚洲专区在线观看 | 亚洲精品无码99在线观看 | 亚洲精品国产V片在线观看| 亚洲女同成人AⅤ人片在线观看| 亚洲av再在线观看| 中文字幕亚洲专区| 国产亚洲人成无码网在线观看| 亚洲国产成人一区二区精品区| 亚洲AV无码乱码国产麻豆 | 亚洲国产精品一区| 亚洲系列国产精品制服丝袜第| 亚洲国产韩国一区二区| 亚洲精品二三区伊人久久| 亚洲熟女综合色一区二区三区| 亚洲精品无码不卡在线播放| 国产精品亚洲精品久久精品| 亚洲精品国产V片在线观看| 国产日韩亚洲大尺度高清| 亚洲国产天堂久久综合网站| 亚洲成人黄色在线观看| 亚洲熟妇AV日韩熟妇在线| 亚洲 小说区 图片区 都市| 亚洲精品岛国片在线观看| 亚洲精品国产精品乱码不99|