1.什么是抽象类?
在Java中,一个没有方法体的方法就应该定义为抽象方法,而如果一个类中有抽象方法,那么这个类就一定要定义为抽象类。
2.抽象类、接口有什么特点?
- 抽象类和抽象方法必须使用 abstract 关键字修饰
//抽象类的定义
public abstract class 类名 {}
//抽象方法的定义
public abstract void eat();
抽象类特点:
-
抽象类中不一定包含抽象方法,抽象方法所在的类一定是抽象类
-
抽象类可以包含非抽象方法、静态方法
-
抽象类不能实例化
-
抽象类可以有构造方法
-
一个类只能继承一个抽象类
-
抽象类的子类
-
要么重写抽象类中的所有抽象方法
-
要么是抽象类
-
接口特点:
- 接口中必须全部都是抽象方法
- 接口中不能定义构造器
- 接口中不能有静态方法
- 接口中的成员必须全部都是public修饰的
- 一个类可以实现多个接口
相同点:
- 都不能够被实例化
- 都可以用来作为引用数据类型
- 如果一个类继承抽象类或实现接口,必须重写所有的抽象方法,否则该类也必须是抽象类
- 抽象方法不能是静态的,因为抽象方法必然会被子类重写,而静态方法是无法被重写的
3.抽象类的具体使用
-
案例需求
定义猫类(Cat)和狗类(Dog)
猫类成员方法:eat(猫吃鱼)drink(喝水…)
狗类成员方法:eat(狗吃肉)drink(喝水…)
-
实现步骤
- 猫类和狗类中存在共性内容,应向上抽取出一个动物类(Animal)
- 父类Animal中,无法将 eat 方法具体实现描述清楚,所以定义为抽象方法
- 有抽象方法必须为抽象类,将Animal定义为抽象类
- 让 Cat 和 Dog 分别继承 Animal,重写eat方法
- 测试类中创建 Cat 和 Dog 对象,调用方法测试
-
代码实现
- 动物类
public abstract class Animal {
public void drink(){
System.out.println("喝水");
}
public Animal(){
}
//抽象方法
public abstract void eat();
}
- 猫类
public class Cat extends Animal {
@Override
//重写抽象方法
public void eat() {
System.out.println("猫吃鱼");
}
}
- 狗类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
- 测试类
public static void main(String[] args) {
Dog d = new Dog();
d.eat();//重写之后的eat
d.drink();//非抽象方法不需要重写,可以直接调用
Cat c = new Cat();
c.drink();
c.eat();
}