1. 程式人生 > >java抽象類+繼承+super用法和this異同

java抽象類+繼承+super用法和this異同


抽象類

抽象類顧名思義也是類,其命名也暗示它是在類的基礎上加以限制(加強條件)而來

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());
	}
}

測試結果
在這裡插入圖片描述