抽象方法和抽象类
有一个需求:要求父类的某个方法必须被子类覆写,那么就需要将父类的方法定义为抽象方法(强制要求被覆写),如果哟个类中出现了抽象方法,那么这个类必须定义为抽象类。
语法:
- 定义抽象类:public abstract class 类名{};
- 定义抽象方法:public abstract 返回值类型 方法名{};
定义一个抽象类
package com.CoderLB;
/**
* 定义一个抽象类
*/
public abstract class Person {
//定义一个普通方法
public void getInfo(){
System.out.println("这是一个普通的成员方法");
}
//定义两个抽象方法
public abstract void say();
public abstract void eat();
}
不能使用抽象类的构造方法实例化对象,此时可以通过子类来继承抽象类的操作,让子类对象去调用。
package com.CoderLB;
import java.io.Serializable;
import java.sql.SQLOutput;
public class Student extends Person {
@Override
public void say() {
System.out.println("我是一个打工人");
}
@Override
public void eat() {
System.out.print("我正在干饭");
}
}
package com.CoderLB;
import java.util.Scanner;
public class Hi {
public static void main(String[] args) {
Student s = new Student();
s.say();
s.eat();
}
}
//输出:
我是一个打工人
我正在干饭
定义了抽象类的子类,当要求子类必须覆写父类的所有抽象方法。
使用将父类的方法定义为抽象方法的方式来实现强制要求覆写某个方法的目的。
但是有一种情况可以不要求子类覆写父类的所有抽象方法,如果子类也是一个抽象类的时候可以不覆写父类的抽象方法。
package com.CoderLB;
import java.io.Serializable;
import java.sql.SQLOutput;
public abstract class Student extends Person {
//可以选择性覆写父类的抽象方法
}
}
总结
- 定义抽象类和抽象方法使用的关键字是“abstract”
- 抽象类(不完整的类):因为它有自己的构造方法,但是却不能直接实例化对象,他的抽象方法没有方法体。
- 如果子类不是一个抽象类那么就必须覆写父类所有抽象方法
几个问题
- 抽象类可以没有抽象方法。
- 如果抽象类没有抽象方法,那么也不可以实例化对象。因为依然是一个抽象类。
- 如果子类不是一个抽象类那么就必须覆写父类所有抽象方法,如果子类是一个抽象类则不强制要求全部覆写父类的抽象方法。
- 抽象类中的抽象方法的abstract关键字不能省略。(在后面的接口中可以被省略)