1. 抽象类
1.1 抽象类是什么
💢💢在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
我们先来看一个简单的例子🌰
// 抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Animal {
// 抽象类中的方法一般要求都是抽象方法,抽象方法没有方法体
abstract void eat();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}
初看上面是不是没啥问题,但是当我们对这个类进行实例化的时候,就会发现:
像这样的类是不是就没有包含足够的信息来描绘一个具体的对象,因此也就不能直接去实例化对象了。那我们应该怎么解决这个实例化问题呢?
// 抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Animal {
// 抽象类中的方法一般要求都是抽象方法,抽象方法没有方法体
abstract void eat();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}
public class Test{
public static void main(String[] args) {
Animal animal = new Animal() {
@Override
void eat() {
System.out.println("重写");
}
};
}
}
只需要对 abstract类的抽象方法实例化之后进行重写即可。
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
1.2 抽象类特性
🍉抽象类不能直接实例化对象,无法创建对象,抽象类是被子类来继承的
Animal animal = new Animal();
// 编译出错
Error:(30, 23) java: Animal是抽象的; 无法实例化
🥑抽象方法不能是 private 的
abstract class Animal {
abstract private void eat(); //抽象方法不能是 private 的
}
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private
🥝抽象方法不能被final和static修饰,因为抽象方法要被子类重写
public abstract class Animal {
abstract final void methodA();
abstract public static void methodB();
}
// 编译报错:
// Error:(20, 25) java: 非法的修饰符组合: abstract和final
// Error:(21, 33) java: 非法的修饰符组合: abstract和static
🍋🟩抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
abstract class Animal {
abstract void eat();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}
class Dog extends Animal{
@Override
void eat() {
// 重写
}
}
abstract class Cat extends Animal{
}
🥬其他特性:
抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量