下面会简单介绍抽象类和接口的定义,并根据它们的属性,了解他们的区别,同时也会引导出他们的适用场景。如有缺陷请斧正。
抽象类
定义:用abstract关键字修饰的类就是抽象类。例:abstract class A{}
注意:
1. 不允许用final修饰抽象类或抽象方法(final关键字修饰的类不能被继承,final修饰的方法不能被重写,这样的话,定义一个没有具体实现的方法和类是么有意义的)。
2.也不允许static关键字修饰抽象方法(static关键字修饰的方法是通过方法名直接访问,他不能访问实例变量和实例方法,他就只能调用本身的方法,不具备用上转型对象调用子类方法的能力,也是没有意义的)
3.抽象类中可以有抽象方法,也可以没有抽象方法
4.抽象方法不能用new关键字创建对象
5.抽象类的对象可以作为上转型对象( Animal a=new Tiger(); a就是上转型对象)
接口
定义: 用interface关键字修饰的类。 例:interface A{}
注意:
1.接口中只有抽象方法,接口中常量都是用public修饰,方法都是用public abstract修饰,我们在定义时,这些修饰符,系统都是帮我们自动省略的。
2.接口的实现用implements关键字,一个类可以实现一个或者多个接口,接口名之间用逗号隔开。例:class A implements B,C,D{}
3.如果非抽象类实现接口,需要重写里面所有的方法,而且访问权限都要用public修饰符进行修饰,不可省略。抽象类可以重写接口中的方法,也可以直接拥有接口中的方法。
4.public修饰的接口是public接口,不加public修饰的接口是友好接口。接口继承接口用extends关键字
5.接口声明的变量是接口变量,可以用来实现接口回调的问题。
区别
1.接口和抽象类都不能实例化,接口必须是abstract方法,而抽象类不用。
2.接口可以用于多继承。抽象类只能继承一个。
3.接口只能有常量,抽象类可以有常量和变量。
4.继承的关键字不一样:接口继承接口和类继承类用extends,类继承接口用implements。
5.抽象类将其抽象方法的实现交给子类,接口将抽象方法的实现交给实现该接口的类。
应用场景
抽象类:某个问题需要子类除了需要重写父类的abstract的方法,还需要从父类继承变量或者重写重要的非abstract方法,就考虑abstract类
接口:某个问题不需要继承,只需要很多子类给出重复的abstract方法的具体实现细节,就用接口