jdk8之前特点对比抽象类
1 接口用interface表示,和类是并列的,定义接口就是定义接口的成员
2 接口只能定义公共抽象方法(public abstract)和全局静态最终变量(public final static),但这些在接口中都是可以省略的,因为接口中的方法和属性只能这样定义,可知接口是没有非抽象方法的,而抽象类中即有抽象方法,也可以有普通方法;
3、接口没有构造器,彻底无法实例化,抽象方法有构造器但依然无法实例化
4、接口可以通过被类实现implement来使用,此时继承接口的类要么全部实现接口的抽象方法,要么被声明为抽象类;
5、java接口可以多实现,弥补了类(抽象类)的单继承的不足;
6、类和类关系是继承(继承是is-a的关系),类和接口关系是实现(接口的实现是能不能的关系),接口与接口之间可以多继承
7、接口实际上是一种规范,同时也体现了多态性,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类则是对某一具事物共性的提取,代码实现方面发挥作用,可以实现代码的重用,适合做基类
接口的典型案例:
典型的应用jdbc,对于全部数据库(mysql,orcle,sql server)共有的操作,删改查事物…用继承数据库接口的形式,规范并统一方法名,即不同的数据库针对统一功能提供相同的方法名(重写的缘故),但其内部的实现细节是和数据库种类相关的,程序员不必关系具体的方法体,只需要熟练地调用数据库操作方法即可顺利完成工作。反之,如果没有jdbc这个接口用于规范,那么各大数据库厂商闭门造车,就会产生各种五花八门甚至非常奇葩的语法API,最终苦的还是程序员,java生态也会受到污染
jdk8新特征
除了定义全局常量和抽象方法外还可以定义默认方法public default/defalut和静态方法public static/static,有以下几个影响;
1、这就使工具类的地位受到威胁,例如,接口有了public static方法那么Collction(接口)就可以逐步取代Collections(普通类)了。
2、接口的适配器模式adapter也会由于接口的default方法的诞生而被淘汰;
interface USB{
//相当于public static final String name = "USB";
String name = "USB";
//相当于public abstract void start();
void start();
void stop();
//jdk8新特征
public static void show(){
System.out.println("这是USB接口");
}
//接口实现类或匿名实现类都可以调用
default void say(){
System.out.println("这个实现类是USB接口的实现类");
}
}
class Flash implements USB{
public static final int a = 1;
@Override
public void start() {
System.out.println("U盘开始工作");
}
@Override
public void stop() {
System.out.println("U盘结束工作");
}
}
class Printer implements USB{
@Override
public void start() {
System.out.println("打印机开始工作");
}
@Override
public void stop() {
System.out.println("打印机结束工作");
}
}
class Computer {
public void transmit(USB usb) {
usb.start();
System.out.println("传输数据.......");
usb.stop();
}
public static void main(String[] args) {
Flash flash = new Flash();
Computer computer = new Computer();
computer.transmit(flash);
//传入USB的匿名类对象参数的方式一
USB phone = new USB() {
@Override
public void start() {
System.out.println("手机传输开始");
}
@Override
public void stop() {
System.out.println("手机传输结束");
}
};
computer.transmit(phone);
//传入USB的匿名类对象参数的方式二
computer.transmit(new USB() {
@Override
public void start() {
System.out.println("MP3传输开始");
}
@Override
public void stop() {
System.out.println("MP3传输结束");
}
});
//jdk8新特性测试
USB.show();
phone.say();
}
}
运行结果