1、抽象类:
-
只支持单继承;
-
类访问修饰符public,不能使用其他修饰符;
-
抽象类不允许被实例化,只能被继承,不可以new出来;
-
抽象类可以包含变量和方法。方法可以是普通方法也可以是抽象方法;
-
包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
-
抽象类中的抽象方法的修饰符只能为public或者protected,缺省情况下默认为public;
-
类继承抽象类,必须实现抽象类中的所有抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。
-
抽象类可以包含构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
2、接口:
-
支持多继承;
-
接口默认是public,不能使用其他修饰符;
-
类实现接口的时候,必须实现接口中声明的所有方法;
-
接口可以包含变量、方法,变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前);
-
JDK1.8中接口中可以定义静态方法、default方法,枚举类型,接口中还可以定义接口(嵌套)。
JDK1.8中对接口增加了新的特性 - 默认方法:JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
JDK1.8中对接口增加了新的特性 - 静态方法:JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
例子:定义接口
public interface IVehicle {
//枚举类型
enum Type {
LOW,
MEDIUM,
HIGH
}
//嵌套接口
interface IWheel {
void run();
}
//default方法
default void init() {
IVehicle.Type type = IVehicle.Type.LOW;
System.out.println(type.ordinal());
}
//静态方法
static void printPrice() {
System.out.println("打印价格!!!");
}
void start();
}
接口实现类及调用:
public class Car implements IVehicle{
@Override
public void start() {
}
}
public class Client {
public static void main(String[] args) {
Car car = new Car();
car.init();//调用接口default方法
car.start();
IVehicle.printPrice();//调用接口静态方法
}
}