什么是抽象类和接口?
抽象类
abstract修饰的类。
1 | abstract class 类名 { |
特点:
- 抽象的方法没有方法体。需要注意的是在抽象类中既可以有抽象方法,也可以有普通方法。
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类不能被实例化,如果被实例化,编译就无法通过。
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
构造方法和类方法不能声明为抽象方法。
抽象方法必须用public、或者protected修饰(不能使用private,子类无法重写,无意义)默认缺省为 public。
接口
interface关键字声明接口
1 | public interface 接口名 { |
特点:
- 接口中每一个方法都是隐式抽象的,接口中的方法会被隐式的指定为public abstract并且只能是。
- 接口中可以含有成员变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法(java8存在变化)。
java8之后接口的变化
在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。
在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。
以下代码在JDK1.8之后是没有问题的(可以通过接口名来调用静态方法 :Main.prinf(); ):
1 | public interface Demo{ |
在JDK1.7,接口中只包含抽象方法,使用public abstract 修饰。
1 | public interface Demo{ |
在JDK1.8,接口中新加了默认方法和静态方法:
默认方法:使用default修饰,在接口的实现类中,可以直接调用该方法,也可以重写该方法。
静态方法:使用static修饰,通过接口直接调用。
1 | public interface Demo{ |
在JDK1.9,接口中新加了私有方法,使用private修饰,私有方法供接口内的默认方法和静态方法调用。
1 | public interface Demo{ |
接口与抽象类区别?
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 抽象类只能单继承,接口可以多继承。
- 抽象类中可以有普通成员变量,接口中没有普通成员变量。
- 抽象类可以有构造方法,接口不能有构造方法。
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只是public static final 类型,并且默认即为 public static final 类型。
- ….
接口和抽象类之间的区别真的要硬说真的还有很多,从各个方面,抽象类是is-a关系,接口是has-a关系;还有他们的使用场景也不同,等等。。这个了解就好。


