java抽象類+繼承+super用法和this異同
阿新 • • 發佈:2019-01-12
抽象類
抽象類顧名思義也是類,其命名也暗示它是在類的基礎上加以限制(加強條件)而來
1 定義限制
- 至少含有一個抽象方法,其餘屬性,方法皆與普通類一致
- 抽象方法是用abstract宣告的方法,無方法體,專門用來給子類繼承
2 使用限制
- 抽象類無法直接例項化物件,但可通過物件多型例項化,如子類物件向上轉型
- 子類繼承抽象類時,必須實現所有抽象方法
super拿來幹啥??
這個結合程式碼將比較好理解,所以具體看程式碼叭,裡面有詳細解釋
關鍵字super,this異同
可看成父類的一個物件,在子類中可以利用其間接呼叫父類的一些私有屬性、方法。除了不可表示當前物件外,用法與this基本相同,可參見 this三種用法
異同表
訪問內容 | this | super |
---|---|---|
通俗理解 | 代表本類的一個物件 | 代表父類的一個物件 |
屬性/方法 | 先找本類,找不到再找父類 | 直接到父類尋找 |
構造方法 | 呼叫本類構造方法,置頂(例項化物件時構造方法在所有方法前自動被呼叫) | 呼叫父類構造方法,置頂 |
物件 | 當前物件(比較物件時使用) | 無此特性 |
例項演練
該例項展示了以下知識點
- 抽象類在繼承中的定義及使用
- 關鍵字super,this的用法
為遵守規範,例項中均為簡單Java類,可參考簡單Java類
核心類說明
1 抽象類Person
該類有四個屬性,為符合java簡單類規範,屬性可見性均為private,本來也需每個屬性設定了setter,getter方法,但偷個懶,這裡就把有用的方法寫出來,小夥伴們意會意會就行;也保留了一個無參構造方法,同時構造方法按引數個數升序排列。
2 子類Student
此類繼承於抽象類Person,添加了兩個屬性,實現了抽象方法getInfo()
3 子類Teacher
與類Student類似
例項程式碼
註釋解釋了相應語句的用法
package basic.parctice;
//抽象類Person
abstract class Person{//抽象類定義,類名和抽象方法前均加關鍵字abstract
//四個私有屬性,分別為姓名,地址,年齡,性別
private String name;
private String addr;
private int age;
private char sex;
//構造方法過載,共四個,分別為無參,二參,四參構造方法
public Person() {}
public Person(String name) {
this.name = name;//this用法:使用本類屬性
}
public Person(String name,String addr) {
this(name);//this用法:呼叫本類一個引數的構造方法
this.addr = addr;//this用法:使用本類屬性
}
public Person(String name,String addr,int age,char sex) {
this(name,addr);//this用法:呼叫本類一個引數的構造方法
this.age = age;//this用法:使用本類屬性
this.sex = sex;//this用法:使用本類屬性
}
//四個屬性對應的setter(偷個懶,小夥伴自行腦補叭),getter方法
public String getName() {
return name;
}
public String getAddr() {
return addr;
}
public int getAge() {
return age;
}
public char getSex() {
return sex;
}
public abstract String getInfo();//抽象方法:獲取資訊
}
//子類Stuent
class Student extends Person{//子類定義+繼承
//新增的兩個屬性
private float math;
private float english;
//過載構造方法
public Student() {}
public Student(String name,String addr) {
super(name,addr);//super用法:呼叫父類構造方法,間接使用父類的私有屬性;
//若是直接使用賦值語句this.name = name,立馬報錯,因為name在父類中可見性為private,子類中無法直接訪問,只可通過父類中的公有方法訪問它
//若是想訪問父類中的公有方法,通常情況下需要先例項化一個物件,通過物件訪問非私有方法/屬性,這有點麻煩
//於是super代表一個預設父類物件應運而生,直接用它訪問就好了,提供了極大便利
}
public Student(String name,String addr,int age,char sex,float math,float english) {
super(name,addr,age,sex);
this.math = math;
this.english = english;
}
//實現抽象方法
public String getInfo() {
return "name:" + super.getName() +" addr:"+super.getAddr()+" age:"+super.getAge()+
" sex:"+super.getSex()+" math:"+this.math+" endlish:"+this.english;
}
}
//子類Teacher與Student如出一轍,交給聰明的你去分析啦,順便檢驗下掌握情況,嘿嘿嘿(真不是我懶喲~)
class Teacher extends Person{
private String subject;
private float salary;
public Teacher() {}
public Teacher(String name,String addr) {
super(name,addr);
}
public Teacher(String name,String addr,int age,char sex,String subject,float salary) {
super(name,addr,age,sex);
this.subject = subject;
this.salary = salary;
}
public String getInfo() {
return "name:" + super.getName() +" addr:"+super.getAddr()+" age:"+super.getAge()+
" sex:"+super.getSex()+" subject:"+this.subject+" salary:"+this.salary;
}
}
public class Demo_Abstract {
public static void main(String[] args) {
System.out.println("===============Student類測試===========");
Student s0 = new Student();
System.out.println(s0.getInfo());//無參
Student s2 = new Student("jun","nanjing");
System.out.println(s2.getInfo());//2參
Student s6 = new Student("jun","nanjing",19,'M',100,100);
System.out.println(s6.getInfo());//6參
System.out.println("===============借用子類物件例項化抽象類測試===========");
Person p = new Student("俊","南京");//借用子類物件例項化抽象類,類似向上轉型
System.out.println("name:"+p.getName());
System.out.println("addr:"+p.getAddr());
System.out.println("===============Teacher類測試===========");
Teacher t0 = new Teacher();
System.out.println(t0.getInfo());
Teacher t2 = new Teacher("李達","南京航空航天大學");
System.out.println(t2.getInfo());
Teacher t6 = new Teacher("李達","南京航空航天大學",30,'M',"英語",10000);
System.out.println(t6.getInfo());
}
}
測試結果