一、抽象類:天生用來當爹的類
Java創建了一種專門用來當做父類的類,這種類稱爲抽象類。目的是要求設計者依據它的格式來修改並創建新的類。
注意:由於抽象類只能作爲父類,所以不能直接由抽象類創建對象,只能通過抽象類派生出新的類,再由新的類創建對象。
二、抽象類定義規則
- 抽象類和抽象方法必須要用abstract關鍵字來修飾。
- 抽象類不能被實例化,也就是不能用new關鍵字去產生對象。
- 抽象方法只需聲明,而不需實現。
- 含有抽象方法的類必須被聲明爲抽象類,抽象類的子類必須複寫所有的抽象方法後才能被實例化,否則這個子類還是個抽象類。
三、抽象類定義格式
abstract class 類名{ //定義抽象類的類名
聲明數據成員;
//定義一般方法
訪問權限 返回值數據類型 方法名稱(參數...){
...
}
//end
//定義抽象方法 只需聲明不需實現
abstract 返回值數據類型 方法名稱(參數...);
//end
}
注意:抽象類中方法的定義有兩種:一種是一般方法,另一種是抽象方法,它是以abstract關鍵字爲開頭的方法,此方法只聲明瞭返回值的數據類型、方法名、參數,沒有方法體。
eg:FirstDemo.java
abstract class Person{ //定義了一個抽象類,類名爲Person
String name; //聲明瞭三個屬性 name age occupation
int age;
String occupation;
abstract String talk(); //定義了一個抽象方法
}
class Student extends Person{ //定義一個類Student並繼承抽象類Person
public Student(String name, int age, String occupation){ //Student類的構造方法
this.name = name;
this.age = age;
this.occupation = occupation;
}
//因爲這個Student類繼承了抽象類Person,所以就要複寫抽象類Person中所有的抽象方法
String talk() {
return "學生->姓名: "+this.name+", 年齡: "+this.age+", 職業: "+this.occupation;
}
}
class Worker extends Person{ //定義一個類Worker並繼承抽象類Person
public Worker(String name,int age,String occupation){ //Worker類的構造方法
this.name = name ;
this.age = age ;
this.occupation = occupation ;
}
//因爲這個Student類繼承了抽象類Person,所以就要複寫抽象類Person中所有的抽象方法
String talk() {
return "工人->姓名: "+this.name+", 年齡: "+this.age+", 職業: "+this.occupation;
}
}
public class FirstDemo {
public static void main(String[] args){
Student s = new Student("張三", 20, "學生");
Worker w = new Worker("李四", 30, "工人");
System.out.println(s.talk());
System.out.println(w.talk());
}
}
運行結果:
學生->姓名: 張三, 年齡: 20, 職業: 學生
工人->姓名: 李四, 年齡: 30, 職業: 工人
與一般的類一樣,抽象類中也可以擁有構造方法,但是這些構造方法必須在子類中被調用
eg:SecondDemo.java
abstract class Person{
String name;
int age;
String occupation;
public Person(String name, int age, String occupation){
this.name = name ;
this.age = age ;
this.occupation = occupation ;
}
public abstract String talk();
}
class Student extends Person{
public Student(String name, int age, String occupation) {
//在這裏必須明確調用抽象類中的構造方法
super(name, age, occupation);
}
public String talk() {
return "學生->姓名: "+this.name+", 年齡: "+this.age+", 職業: "+this.occupation;
}
}
public class SecondDemo {
public static void main(String[] args){
Student s = new Student("張三", 20, "學生");
System.out.println(s.talk()) ;
}
}
運行結果:
學生->姓名: 張三, 年齡: 20, 職業: 學生