什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
什么是抽象方法
抽象方法的格式
//用abstract修饰 没有方法体
//抽象方法必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下默认为 public。
//如果一个方法里面含有抽象方法,那么这个类必须是抽象类, 反之抽象类中不一定有抽象方法.
public abstract void show();
抽象类的注意事项
-
抽象类不能实例化,因为抽象类里面有抽象方法,如果抽象类能够实例化,通过对象.抽象方法来调用是没有意义的,抽象方法是没有方法体的.
-
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类,抽象类中可以存在普通方法
-
抽象类一定有构造方法, 因为抽象类中会有成员变量,而抽象类一般是要被子类继承的,子类创建对象的时候需要调用父类构造器初始化父类的成员变量.
-
抽象类的子类必须要重写抽象父类的全部抽象方法, 除非该子类也是一个抽象方法.
abstract关键字的冲突问题
- final: 被abstract修饰的类强制要求被重写, 而被final修饰的类是不能被重写的.
- private: 被abstract修饰的类强制要求被重写, 而被private修饰的类不能重写
- static: static修饰的方法可以已类名.方法直接调用,抽象类.方法是没有意义的.
案例:
//动物类(抽象父类)
public abstract class Animal {
//抽象方法
public abstract void eat();
public void drink(){
System.out.println("喝水");
}
}
//定义猫类
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 class Demo1 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.drink();
cat.eat();
Dog dog = new Dog();
dog.drink();
dog.eat();
}
}