【接口】Java 接口是什么以及如何使用
创始人
2024-02-24 11:45:57
0

接口简概

接口概念:在 Java 程序设计语言中, 接口不是类,而是对类的一组需求描述,这些类要遵从接口描 述的统一格式进行定义 。

接口中的所有方法自动地属于 public 。 因此,在接口中声明方法时,不必提供关键字 public。

在接口中可以定义常量。然而,更为重要的是要知道接口不能提供哪些功能。接口绝不能含有实例域 。

在JavaSE 8时,可以在接口中提供简单方法了。当然, 这些方法不能引用实例域——接口没有实例。

提供实例域和方法实现的任务应该由实现接口的那个类来完成。因此,可以将接口看成是没有实例域的抽象类,但是这两个概念还是有一定区别的。

要将类声明为实现某个接口, 需要使用关键字 implements。 为了让类实现一个接口, 通常需要下面两个步骤: 1 ) 将类声明为实现给定的接口。 2 ) 对接口中的所有方法进行定义。

在接口声明中,不需要将方法声明为 public , 这是因为在接口中的所有方法都自动地是 public 。不过,在实现接口时, 必须把方法声明为 public。

接口的特性

接口不是类,尤其不能使用 new运算符实例化一个接口。

尽管不能构造接口的对象,却能声明接口的变量。

Comparable x ; // OK

接口变量必须引用实现了接口的类对象 。

x = new Employee (. . .); // OK

如同使用 instanceof检查一个对象是否属于某个特定类一样, 也可以使用 instanceof 检查一个对象是否实现了某个特定的接口。

if (anObject instanceof Comparable) { . . . }

与可以建立类的继承关系一样,接口也可以被扩展,使用关键字 extends。这里允许存在多条从具有较高通用性的接口到较高专用性的接口的链。

接口中的方法都自动地被设置为 public —样,接口中的域将被自动设为 public static final

可以将接口方法标记为 public, 将域标记为 public static final。有些程序员出于习惯或提高清晰度的考虑,愿意这样做。但 Java 语言规范却建议不要书写这些多余的关键字。

每个类只能够拥有一个超类, 但却可以实现多个接口。这为定义类的行为提供了极大的灵活性。

静态方法

在 Java SE 8 中,允许在接口中增加静态方法。理论上讲,没有任何理由认为这是不合法的。只是这有违于将接口作为抽象规范的初衷。

目前为止, 通常的做法都是将静态方法放在伴随类中。在标准库中, 你会看到成对出现的接口和实用工具类, 如 Collection/Collections 或 Path/Paths 。

在Java SE 8 中, 可以为 Path 接口增加静态方法,这样一来, Paths 类就不再是必要的了。 不过整个 Java 库都以这种方式重构也是不太可能的, 但是实现你自己的接口时,不再需要为实用工具方法另外提供一个伴随类。

默认方法

在 Java SE 8 中,可以为接口方法提供一个默认实现。 必须用 default 修饰符标记这样一个方法。

有些情况下, 默认方法可能很有用。例如,只对接口中的某几个方法感兴趣,而不是全部。

默认方法可以调用任何其他方法。

在 JavaAPI 中,你会看到很多接口都有相应的伴随类,这个伴随类中实现了相应接口 的部分或所有方法,如 Collection/AbstractCollection 或 MouseListener/MouseAdapter。在 JavaSE 8 中, 这个技术已经过时。现在可以直接在接口中实现方法。

默认方法的一个重要作用是“‘ 接口演化” (interface evolution)。 对于一些老版本的接口,如果要在上面增添新功能时,默认方法就不失为一个好的选择,因为默认方法不会对以前的接口实现产生影响。为接口增加一个非默认方法不能保证“源代码兼容”(source compatible)。

解决默认方法冲突

如果先在一个接口中将一个方法定义为默认方法, 然后又在超类或另一个接口中定义了 同样的方法, 会发生什么情况? Java 的规则要简单得多。

  1. 超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。“ 类优先” 规则可以确保与 Java SE 7 的兼容性。如果为一个接口增加默认方法,这对于 有这个默认方法之前能正常工作的代码不会有任何影响。

  2. 接口冲突。 如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法, 必须覆盖这个方法来解决冲突。

    • 当一个类要实现的接口中有多个相同的默认方法时,并不是从中选择一个,Java 编译器会报告一个错误 ,让程序员来解决这个二义性
    • 当一个类要实现的接口中有多个相同的方法时, 如果至少有一个接口提供了一个实现,编译器就会报告错误, 而程序员就必须解决这个二义性 。Java 设计者更强调一致性。两个接口如何冲突并不重要。
    • 如果两个接口都没有为共享方法提供默认实现, 那么就与 Java SE 8之前的 情况一样,这里不存在冲突 。 实现类可以有两个选择:实现这个方法,或者干脆不实现。 如果是后一种情况,这个类本身就是抽象的。

千万不要让一个默认方法重新定义 Object 类中的某个方法。例如,不能为 toStringequals 定义默认方法, 尽管对于 List 之类的接口这可能很有吸引力, 由于“ 类优先” 规则, 这样的方法绝对无法超越 Object.toStringObjects.equals

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...