回想前面我们的猫狗案例,提取出一个动物类,并且我们在前面也创建了动物对象,其实这是不对的!为什么呢?
- 因为我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。所以说,动物本身并不是一个具体的事物
- 而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是给出一个声明即可。
所以,在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果没有抽象方法,该类必须定义为抽象类。
抽象类概述:
- 动物不应该定义为具体的东西,而且动物中的吃,睡等方法也不应该是具体的。
- 我们把一个不是具体的功能称为抽象功能,而一个类中如果有抽象功能,该类必须是抽象类。
那么,抽象类有什么特点呢?
- A:抽象类和抽象方法必须用abstract关键字修饰
- B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定位为抽象类
- C:抽象类不能实例化
因为他不是具体的,抽象类也有构造方法,但是不能实例化,那么构造方法的作用是什么呢?
用于子类访问父类数据的初始化。 - D:抽象类的子类问题
a:如果不想重写抽象方法,该子类是一个抽象类
b:重写所有的抽象方法,这个时候子类是一个具体的类。 - E:抽象类的实例化其实是靠具体的子类来实现的,是使用多态的方式
Animal a = new Cat();
代码示例:
//abstract class Animal 抽象类的申明格式
abstract class Animal {
//抽象方法
//空方法体和没有方法体的区别
//public abstract void eat() {}//空方法体 ,这个会报错。抽象方法不能有主体
public abstract void eat(); //没有方法体
public Animal() {}
}
//子类是抽象类
abstract class Dog extends Animal {
}
// Cat不是抽象的, 并且未覆盖Animal中的抽象方法eat()
//子类是具体类,重写抽象方法
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼!");
}
}
class AbstractDemo {
public static void main(String[] args) {
//创建对象
//Animal是抽象的; 无法实例化
//Animal a = new Animal();
//通过多态方法
Animal a = new Cat();
a.eat();
}
}