抽象方法,抽象類
(一)抽象方法:
- 定義:隻聲明而未實作的方法,即沒有方法體的方法。
-
抽象方法使用 abstract 修飾,具有抽象方法的類也用 abstract 修飾。
即 具有抽象方法的類一定是抽象類,但抽象類中不一定有抽象方法。
abstract class Stu{
//該方法隻是聲明了一個print()方法,沒有方法體,是以是一個抽象方法。
public abstract void print();
}
(二)抽象類
- 定義:使用abstract 修飾的類。
- 抽象類沒辦法執行個體化對象,抽象類的執行個體化對象可以通過其子類執行個體化。
-
抽象類中的 所有 抽象方法需要被子類覆寫。
如果子類繼承抽象類,如果沒有覆寫父類的抽象方法,則必須使用abstract修飾子類。但此時依然不能執行個體化對象。
- 抽象方法不能使用private修飾,因為由private修飾的方法子類隻能繼承不能覆寫。
- 如果抽象父類沒有無參構造方法,那麼子類必須通過super明确指定構造方法。
- 抽象類中允許沒有抽象方法,但此時抽象類依然不能執行個體化。
- 抽象類不能用final修飾,因為final修飾的類不能有子類,但抽象類又必須有子類。
(三)抽象類的應用(局部内部類,匿名内部類的使用)
- 普通使用
//4. 定義主類
public class Test0001{
public static void main(String[] args){
//4.1 父類通過其子類進行執行個體化(向上轉型)
Person person1 = new Student("張三");
Person person2 = new Teacher("jack");
//4.2 通過執行個體化對象調用每個子類中具體實作的父類的抽象方法
System.out.println(person1.getInfo());
System.out.println(person2.getInfo());
}
}
//1,定義抽象類
abstract class Person{
private String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
//1,1定義抽象方法getInfo()
public abstract String getInfo();
}
//2,定義Student 子類繼承抽象類
//2.1 子類中覆寫父類的抽象方法(具體實作)
class Student extends Person{
public Student(String name){
super(name);
}
public String getInfo(){
return "學生姓名是:"+this.getName();
}
}
//3,定義Teacher 子類繼承抽象類
//3.1 子類中覆寫父類的抽象方法(具體實作)
class Teacher extends Person{
public Teacher(String name){
super(name);
}
public String getInfo(){
return "教師姓名是:"+this.getName();
}
}
結果如下:
-
使用局部内部類
舉例如下:
public class Test0001{
public static void main(String[] args){
//2. Person類已經在其子類 Worker 中執行個體化,此處可直接建立對象即可
Person person3 = Person.getObject();
System.out.println(person3.getInfo());
}
}
//1. 定義抽象類
abstract class Person{
private String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
//1.1 在抽象類中定義抽象化方法
public abstract String getInfo();
//1.2 在抽象類中定義一個普通方法,為定義局部内部類作基礎,
//将該普通方法用static 修飾,友善在主類中好調用該方法
public static Person getObject(){
//1.3 在抽象方法的普通方法中定義局部内部類
class Worker extends Person{
public Worker(String name){
super(name);
}
public String getInfo(){
return "勞工姓名是:"+this.getName();
}
}
return new Worker("王五");
}
}
結果如下:
-
使用匿名内部類
舉例:
public class Test0001{
public static void main(String[] args){
Person person4 = Person.getObject();
System.out.println(person4.getInfo());
}
}
//1. 定義抽象類
abstract class Person{
private String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
//1.1 定義抽象方法
public abstract String getInfo();
//1.2 定義一個普通方法,是為了在普通方法中定義一個匿名内部類
public static Person getObject(){
//1.3 定義匿名内部類,該内部類沒有名字,也就沒有構造方法,同時該内部類繼承了父類Person類
return new Person("孫六"){
//1.4 在匿名内部類中覆寫父類抽象類中的抽象方法(具體實作)
public String getInfo(){
return "勞工姓名:"+this.getName();
}
};
}
}
結果如下: