繼承&抽象類
第一題:概念辨析
-
什麼叫做類與類的繼承,作用是什麼?
-
就是子類繼承父類的屬性和行為,使得子類物件具有與父類相同的屬性、相同的行為。
-
作用是子類複用父類內容。
-
-
繼承後,父類與子類之間,各成員有什麼樣的影響?
-
成員變數:
-
不重名,沒有影響。
-
重名,就近使用,使用super區分父類變數。
-
-
構造方法:
-
無影響,但是子類構造方法預設呼叫父類構造方法
-
-
成員方法:
-
不重名,沒有影響。
-
重名,子類重寫父類方法。
-
-
-
子類中,如何呼叫父類的成員?如何使用本類的成員?
-
父類成員方法:super.方法名
-
父類非私有成員變數:super.變數名
-
子類成員方法:this.方法名
-
子類成員變數:this.變數名
-
-
抽象方法與普通成員方法有什麼區別?
-
抽象方法使用abstract關鍵字修飾,沒有方法體。
-
成員方法有方法體。
-
-
抽象類與普通類有什麼區別?
-
方法:
-
抽象類可以包含抽象方法和成員方法。
-
普通類不可以包含抽象方法,只有成員方法。
-
-
物件:
-
抽象類不可以建立物件。
-
普通類可以建立物件。
-
-
第二題:語法練習
-
語法點:繼承,抽象類
-
按步驟編寫程式碼,效果如圖所示:
-
編寫步驟:
-
定義抽象類A,抽象類B繼承A,普通類C繼承B
-
A類中,定義成員變數numa,賦值為10,抽象showA方法。
-
B類中,定義成員變數numb,賦值為20,抽象showB方法。
-
C類中,定義成員變數numc,賦值為30,重寫showA方法,列印numa,重寫showB方法,列印numb,定義showC方法,列印numc。
-
測試類中,建立C物件,呼叫showA方法,showB方法,showC方法。
-
-
參考答案:
public class Test2 { public static void main(String[] args) { // 建立C物件 C c = new C(); // 呼叫c 中方法 c.showA(); c.showB(); c.showC(); } } abstract class A{ int numa = 10; public abstract void showA(); } abstract class B extends A{ int numb = 20; public abstract void showB(); } class C extends B{ int numc = 30; @Override public void showA() { System.out.println("A類中numa:"+numa); } @Override public void showB() { System.out.println("B類中numb:"+numb); } public void showC(){ System.out.println("C類中numc:"+numc); } }
第三題:語法練習
-
語法點:繼承,抽象類
-
按步驟編寫程式碼,效果如圖所示:
-
編寫步驟:
-
模擬農學院動物醫療系統資訊。
-
定義抽象家禽類(Poultry)
-
私有成員變數:動物種類(name),症狀(symptom),年齡(age), 病因(illness)
-
提供空參和帶參構造方法
-
成員方法:
-
抽象方法症狀(showSymptom)
-
普通方法基本資訊(showMsg)
-
提供setXxx和getXxx方法
-
-
-
定義普通鴨子類(Duck)
-
提供空參和帶參構造方法
-
重寫showSymptom方法,列印症狀資訊。
-
-
-
參考答案:
public class Test3 { public static void main(String[] args) { Duck duck = new Duck("鴨子", "感冒", "發燒", 2); duck.showMsg(); duck.showSymptom(); } } /* 1.定義抽象家禽類(Poultry) */ abstract class Poultry { // i.成員變數(私有): private String name; private String illness; // 症狀(symptom) private String symptom; // 年齡(age) private int age; // ii.成員方法: showSymptom public abstract void showSymptom(); // 成員方法: showMsg public void showMsg() { System.out.print("動物種類:" + name); System.out.println(",年齡:" + age + "歲"); System.out.println("入院原因:" + illness); } // iii.提供空參和帶參構造方法 public Poultry() { super(); } public Poultry(String name, String illness, String symptom, int age) { this.name = name; this.illness = illness; this.symptom = symptom; this.age = age; } // iv.提供setXxx和getXxx方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIllness() { return illness; } public void setIllness(String illness) { this.illness = illness; } public String getSymptom() { return symptom; } public void setSymptom(String symptom) { this.symptom = symptom; } } // Duck 類 class Duck extends Poultry { public Duck() { } public Duck(String name, String illness, String symptom, int age) { super(name, illness, symptom, age); } @Override public void showSymptom() { System.out.println("症狀為:" + getSymptom()); } }
第四題:語法練習
-
語法點:繼承
-
按步驟編寫程式碼,效果如圖所示:
-
編寫步驟:
-
模擬教學管理系統師生資訊。
-
定義Person類。
-
屬性:姓名、年齡
-
構造方法:無參構造方法,有參構造方法
-
成員方法:getXxx方法,setXxx方法,顯示基本資訊showMsg方法
-
-
定義Teacher類,繼承Person
-
屬性:學科
-
構造方法:無參構造方法,有參構造方法
-
成員方法:getXxx方法,setXxx方法,講課方法
-
-
定義Student類,繼承Person
-
屬性:分數
-
構造方法:無參構造方法,有參構造方法
-
成員方法:getXxx方法,setXxx方法,考試方法
-
-
-
參考答案:
public class Test4 { public static void main(String[] args) { // i.建立老師物件t,並把名稱賦值為”王小平”,年齡賦值為30,工資賦值為8000 Teacher t = new Teacher("王小平", 30, "Java"); // iii.呼叫老師物件t的講解方法 t.teach(); // iv.建立學生物件 s,並把名稱賦值為”李小樂”,年齡賦值為14,成績賦值為90分. Student s = new Student("李小樂", 14, 90); // vi.呼叫學生物件 s 的考試方法 s.exam(); } } class Person { // 名稱(name) private String name; // 年齡(age) private int age; // 空參構造 public Person() { } // 帶參構造 public Person(String name, int age) { this.name = name; this.age = age; } // setXxx和getXxx方法 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; } } /* 2.定義老師類(Teacher),繼承Person類 */ class Teacher extends Person { // course(科目) private String course; // 空參構造 public Teacher() { } // 帶參構造方法 public Teacher(String name,int age, String course) { super(name,age); this.course = course; } // 提供setXxx和getXxx方法 public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } public void teach() { System.out.println(getName() +"老師,講授"+course +"課"); } } /* 3.定義學生類(Student),繼承Person類 */ class Student extends Person { // score(成績) private int score; // 無參構造 public Student() { super(); } // 帶參構造 public Student(String name, int age,int score) { super(name, age); this.score = score; } // 提供setXxx和getXxx方法 public int getScore() { return score; } public void setScore(int score) { this.score = score; } public void exam(){ System.out.println(getName()+"同學,考試得了:"+ score +"分"); } }
第五題:語法練習
-
語法點:繼承
-
按步驟編寫程式碼,效果如圖所示:
-
編寫步驟
-
模擬汽車網站資訊。
-
定義汽車Auto類
-
屬性:品牌,車長,價格
-
-
定義SUV繼承Auto類
-
屬性:小型車車長標準值:4295,中型車車長標準值:5070。
-
定義判斷車型方法
-
判斷小型車:小於小型車車長標準值
-
判斷大型車:大於中型車車長標準值
-
判斷中型車:大於小型車車長標準值並且小於等於中型車車長標準值
-
-
-
測試類中,建立若干SUV物件,儲存到集合,遍歷集合,輸出中型SUV。
-
-
參考答案:
public class Test5 { public static void main(String[] args) { // 建立SUV物件 SUV suv1 = new SUV(5079, 750000); SUV suv2 = new SUV(4813, 760000); SUV suv3 = new SUV(4270, 127800); SUV suv4 = new SUV(4545, 188800); //新增到集合中 ArrayList<SUV> list = new ArrayList<>(); list.add(suv1); list.add(suv2); list.add(suv3); list.add(suv4); // 遍歷集合,查詢中型SUV for (int i = 0; i < list.size(); i++) { SUV suv = list.get(i); if (suv.midSUV()){ suv.showMsg(); } } } } // 定義汽車類 class Auto { private String type; private double length; private double price; public Auto() { } public Auto(String type, double length, double price) { this.type = type; this.length = length; this.price = price; } public String getType() { return type; } public void setType(String type) { this.type = type; } public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public void showMsg() { System.out.println("車型:" + type); System.out.println("\t價格:" + price); System.out.println("\t車長:" + length); } } // 定義SUV類 class SUV extends Auto { // 車長標準 private int miniLength = 4295; private int midLength = 5070; public SUV(double length, double price) { super("SUV", length, price); } // 判斷 小型車 public boolean miniSUV() { return getLength() <= miniLength; } // 判斷 大型車 public boolean largeSUV() { return getLength() > midLength; } // 判斷 中型車 public boolean midSUV() { return getLength() > miniLength && getLength() <= midLength; } }