引言
父类、抽象类、接口常常搞混,到最后分不清楚他们出现的原因,以及使用的场景,下面来解密。
1.父类
当我们多个类中存在共同的方法的时候,把共同方法抽象出来放到父类中,然后再把这种特征从父类中继承下来。这样符合我们面向对象的本质,根据现实世界的本质来设计的语言。
宠物类class Pet{ public void eat(){} }
狗类class Dog extends Pet{ public void eat(){} }
猫类class Cat extends Pet{ public void eat(){} }
存在问题
我们发现在实例化对象的时候父类被实例后是没有实际意义的,也不会存在父类这种动物的,故提出了抽象类
2.抽象类
抽象abstract类规定:
- 抽象方法必须被重写,没有方法体,不能被private修饰
- 有抽象方法的必须是抽象类
- 抽象类可以没有抽象方法
- 抽象类不可以被实例化,不存在构造方法
这样可以看出来,抽象类也就是特殊的父类,也可以有普通方法和父类一样,只不过不支持被实例化。
存在问题
抽象类只能被继承一次,而有时候我们需要继承多个类的特性。故提出了接口。
3.接口
接口规定:
- 接口能继承多个接口
- 接口中的变量都是静态常量 static final
- 接口中的方法都是public abstract
- 实现类必须实现所有的抽象方法(default修饰的方法除外)
4.匿名内部类
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {//接口的实现,实现了接口的方法
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}