抽象类VS接口

抽象方法:

抽象方法没有方法体;抽象方法必须在抽象类里;抽象方法必须在子类中被实现,除非子类是抽象类。(实例化没有意义就可以定义为抽象类)

抽象类:

不能被实例化(但可以创建一个引用变量,其类型是一个抽象类,指向非子类实例),抽象方法必须在抽象类里;抽象类中不一定有抽象方法;一个抽象类的抽象方法必须被子类实现,除非子类也是抽象类。

关键字:abstract;

注意:没有抽象构造方法,也没有抽象静态方法;抽象类里可以有非抽象方法,创建子类的实例时可以调用

接口

关键字:interface

语法:

修饰符 interface 接口名称[externds 其他接口名]{

//声明变量

//声明方法

}

1.解决单根继承,系统对外提供的所有服务

接口特性;

接口中的变量都是静态常量(public static fianl),必须显式初始化。

接口中所有的方法默认都是public absract

接口没有构造方法,不可以被实例化,但可以被实现。

接口里可以声明(并且可以提供实现)静态方法

接口中的静态方法必须的是public 的,public修饰符可以省略,static修饰符不能省略;静态方法不能被继承及覆盖,所以被具体 所在的接口调用;接口中静态方法可以有多个

 

接口可以有默认方法,接口中可以定义默认法方法default,就可以有方法体,默认方法会被直接继承,通过实例直接调用。如果一个类实现了多个接口,多个接口都定义了多个同样的默认方法

方案一:实现类需要覆盖重写接口中的默认方法不然会报错

方案二:可以使用super来调用指定接口的默认方法

如果一个类继承了抽象类,实现了一个接口,抽象类和接口存在相同的方法(采取类优先的原则,优先继承抽象类的方法)

默认接口可以有多个

默认方法的好处解决了接口与其实现类之间耦合度过高,修改接口,所有实现类必须随之修改的问题

实现类可以实现多个接口;

关键字:implements,多个接口使用逗号隔开

总结;一个类通过实现接口的方式,从而来继承接口的抽象方法;

一个类只能继承 一个类,但可以实现多个接口;

一个接口不能实现另一个接口,但可以继承多个其他接口。

 

抽象类和接口

相同点:代表系统的抽象层

都不能被实例化

都能包含抽象方法(用于描述系统提供的服务,不必提供具体实现)

不同点:在抽象类中可以为部分普通方法提供默认实现

一个类只能继承一个直接的父类,但可以实现多个接口

抽象类和接口使用原则:

is-a抽象类;has-a接口

接口做系统与外界交互的窗口(接口提供服务)

接口本身一旦制定,就不允许随意修改

抽象类可以完成部分功能的实现,还有部分功能可以作为系统的扩展点

抽象类便于复用,接口便于功能扩展和维护

原文地址:https://www.cnblogs.com/tiantongtong/p/13181817.html