接口

  1. 接口的概念
    接口表示某种能力,是若干行为的集合。
    接口可以被看作为某种数据引用类型,接口是比抽象类更抽象的“类型”。
    接口描述着具备某种能力所应该包含的行为集合,它只提供抽象层面的概念。具体的实现是由接口的实现类(可以看作是接口的子类)来完成的。
    这样可以将行为的定义与实现分离开,对程序的代码结构进行优化。
    一切对象都具备着各种能力,即从一切对象中都可以抽象出不同的接口

  2. 接口的声明
    接口的声明使用interface关键字。接口代码也是被保存在java的源代码文件中的,编译生成的字节码文件同样是.class后缀。

public interface Moveable{
       void move();
}

各版本JDK对接口的定义有些不同:
相同点:
接口中所有的变量都公有的静态常量(public static final修饰)
接口中所有非static方法都是公有的。
不同点:
Java 7及以前版本:接口中只能包含公有的抽象方法,不能出现有实现体的具体方法
Java 8:接口中可以包含还有实现的具体方法,这种方法分为两类:默认方法(default)、静态方法(static),但它们必须是公有的
Java 9至当前版本:接口中可以加入私有的静态方法和私有的strictfp方法

  1. 实现接口
    类与接口之间的关系被称为实现,即类能实现某些接口。
    实现关系的声明用implements关键字
    当类实现接口以后,相当于声明此类具备了已经实现接口中定义的能力,实现类需要重写接口中的所有抽象方法,除非此类是抽象类。
public class Car implements Moveable{
       private int currentSpeed;
       //构造器
       public Car(int currentSpeed) {
        super();
        this.currentSpeed = currentSpeed;
        }
        // 汽车类的对象实现了Moveable接口中定义的抽象方法
        // 表示汽车拥有可移的能力,具体行为由以下方法实现
        @Override
        public void move(){
              System.out.println(String.format("汽车在公路上以%d的时速行驶着。", currentSpeed));
        }
          
}

实现类会继承接口中的所有公有方法。

  1. 类实现接口的意义

    • 类实现接口,即把接口的类型赋予实现类,实现类就具备了接口定义的能力。
    • 在实现类中重写接口里的方法,即让接口中定义的抽象行为具体化。
    • 接口与实现类,分离了代码中的高层功能契约与具体行为实现,可以让优化程序代码结构的工作更加轻松。
  2. 类可以实现多个接口

    • Java的类是单继承体系,即一个类的直接父类只能有一个。虽然此特性避免了多继承体系带来的混乱,但同时也让Java类的继承成本大大提高。
    • 接口可以弥补单继承体系的缺点,因为Java的类可以同时实现多个接口,也就是说实现了多个接口的类同样也拥有多种类型(多种功能)。即Java使用多接口实现替代了类的多重继承,保留了多重继承的优点,避免了它带来的问题。
    • 多继承的弊端:当多个父类中有相同行为时,子类调用会产生不确定性
    • 其根本原因在于多继承父类中的方法是有具体实现的,而导致调用运行时,不确定运行哪个父类中的方法。而接口中的行为往往都是抽象方法,这些方法由子类具体实现,所以避免了以上问题。
      多接口实现的例程:
public interface Moveable {
    void move();
}
public interface Flyable {
    void fly();
}
public class Plane implements Moveable, Flyable {
    private String name;
    public Plane(String name) {
        super();
        this.name = name;
    }
    @Override
    public void fly() {
        System.out.println(String.format("%s正在天空中飞行。", name));
    }
    @Override
    public void move() {
        System.out.println(String.format("%s正在航空跑道上加速,准备起飞。", name));
    }
}
  1. 接口的继承
    接口之间也有继承关系,同样使用extends关键字声明,但与类不同的是,一个接口可以同时继承自多个父接口,即在Java中,接口是多重继承的。
    接口的多重继承例程:
// SuperHero接口中拥有3个方法:
// 从两个父类继承来的fly()和move()
// 自己扩展出的swim()
public interface SuperHero extends Flyable, Moveable {
    void swim();
}

public class MonkyKing implements SuperHero {
    @Override
    public void fly() {

    }

    @Override
    public void move() {

    }

    @Override
    public void swim() {

    }
}

如果在多个父接口中存在着相同方法,实现类只需要实现此方法一次即可

  1. 继承父类的同时实现接口
    如果一个类已经扩展自一个父类,又想对其进行功能扩展,就可以让此类去实现相应的功能接口。

父类提供基础属性和行为,接口提供扩展功能

接口的优点

  • 接口为类提供了功能的扩展点
  • 接口公开了通用的行为契约或规范,而具体的实现被隐藏到实现类中
  • 接口降低了程序代码的耦合度,让程序的扩展和优化更加轻松灵活

接口与抽象类的异同(java 12)
相同点:
a. 都可以创建程序的抽象层次结构
b. 都不可以被直接实例化
c. 通常都声明抽象方法来定义行为能力,让子类去扩展这些功能

不同点:
a. 抽象类中可以声明构造方法,接口中不能存在构造方法
b. 子类只能继承一个抽象类,但可以实现多个接口、
c. 类之间是单继承,接口之间是多继承
d. 抽象类为子类提供基础数据和方法,它们之间是is-a关系;接口为实现类提供扩展功能,它们之间是like-a关系
e. java 7及以前的版本,抽象类中可以声明程序访问修饰符修饰的抽象和具体方法,而接口中只有声明公有的抽象方法
f. java 8版本时,接口中可以定义具有方法体的默认方法和静态方法,但它们一定是公有的
g. 虽然是不推荐的做法,但在抽象类中的静态方法是可以通过引用变量名进行调用的;而接口中的静态方法必须使用接口名称调用
h. java 9以后,接口中的静态方法可以被声明为私有的,但不可以是protected和package级别的
i. java 9以后,接口中可以加入私有的被strictfp关键字修饰的具体方法,此类方法可以是静态的,也可以是非静态的,但除了private以外不能使用其他访问修饰符修饰。

  1. 如何在接口和抽象类中进行选择

    • 优先使用接口
    • 当子类中存在共同行为和属性时,才让子类继承抽象类
  2. 接口中的默认方法
    java 8以后,在java中可以添加以default关键字修饰的方法,这种方法被称为默认方法。默认方法是有具体实现的方法。
    添加默认方法的主要目的:
    在软件的长期维护过程中,如果向既有接口里添加新的抽象方法,会导致要在所有此接口的实现类中都去重写新加入的方法,对代码有巨大影响。
    而引入具有实现的默认方法就解决了以上问题。默认方法中有着相对通用的默认实现,如果实现类需要重写此方法,再去进行子类中的重写。默认方法以一种相对平缓的方式扩展接口的行为,不是强制让实现类重写新方法,而是引导实现类去重写新方法。

默认方法可以被认为是Lambda表达式和JDK标准API之间的桥梁。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 是该写点东西发点图,才能对得起这么美的雪。我是一个永远可以看到事物悲哀之处的人,别人都在狂欢的雪景我却看到了...
    prismapaul阅读 208评论 0 1
  • springboot+springsecurity基本配置 https://github.com/longfeiz...
    斜月86阅读 258评论 0 0
  • 今天带着儿子回家看爸妈,正准备吃饭的时候,看到儿子离开座位,坐在了挂衣柜和放电视的平柜中间放着的一个凳子上,腿尽力...
    梦幻公主赵阅读 346评论 0 5