接口是什么?Interface是什么?Java Interface是什么?Java 接口是什么?
Interface属于什么类型?
在编程语言中,“Interface”属于什么类型?
在Java编程中,“Interface”属于什么类型?
在Java编程语言中,“接口”属于什么类型?
什么是Java中的一个接口?
什么是 Java 接口?
一个 Java 接口的定义是什么?
一个 Java 接口的作用是什么?
一个 Java 接口有什么用处?
普遍认为这是大多数Java学习者的常见问题。
即使如此, 许多经验丰富的Java开发者也难以对其作用进行清晰阐述。
其具体功能和作用是什么?
是否感到困惑?
实际上, 这一概念在设计时就显得不够完善, 它更像是对现有系统的一个临时修补方案。
因此, 不太令人意外。
相信你自己, 你疑惑一个东西的时候
说明这个东西并不是什么好东西
比如说给你一篇 文章 官方程式化语言较多,
文章的核心观点难以找到让人困惑的地方,
这样的文章是否合适?
回答是:非常不合适。
下面听我给你讲讲Java的接口到底是什么? 有什么作用? 为什么要用接口?
我的改写说明
为什么这么说, 我给你看一个例子你就明白了:
假设我有这么一个类:
//这是一个手机游戏里面的一个游戏角色
//它具有 x, y坐标 宽度width, 高度height
class Player extends A {
int getX() {...}
int setX(x) {...}
int getY() {...}
int setY(y) {...}
int getWidth() {...}
int setWidth(w) {...}
int getHeight() {...}
int setHeight(y) {...}
}
//我们有一个方法是让这个角色跳跃
void jump(Player player) {
//这里的代码只是例子
player.setX(player.getX() + 100)
player.setY(player.getY() + 500)
player ...
...半空中翻了三圈...
...手臂左边挥了一下, 再右边挥了一下...
...此处省去一万行代码....
...player 的引用在这段代码里面出现了5000次...
...总之假设这个方法非常复杂, 很多哈...
...
}
好了, 让这段代码跑起来
我们看到手机里的玩家开始正常地跳跃了
产品设计人员指导了我如何在手机应用中添加一个"怪物"这一功能, 该"怪物"完美模仿了玩家的跳跃动作. 假设Java没有接口:
class Player extends A {
int getX() {...}
int setX(x) {...}
int getY() {...}
int setY(y) {...}
...
}
void jump(Player player) {
//这里的代码只是例子
player.setX(player.getX() + 100)
player.setY(player.getY() + 500)
player ...
...半空中翻了三圈...
...手臂左边挥了一下, 再右边挥了一下...
...此处省去一万行代码....
...总之这个方法非常复杂, 很多...
...
}
//我新加了一个怪物类
class Monster extends B {
int getX() {...}
int setX(x) {...}
int getY() {...}
int setY(y) {...}
...
}
Monster monster = new Monster()
jump(monster) 这里因为monster类型不匹配而报错, 不可以直接使用jump方法对monster实现跳跃
问题来了:
跳转函数jump(monster)在 monster 类型不匹配的情况下会导致编译错误
说实话, 我编写这段代码花费了一个整天的时间, 从下午一直加班到午夜十二点才完成
我实在没有办法继续
此外 player 继承了 A 同时 monster 继承了 B 而 A 和 B 都是它们必须得继承的类 然而 Java 并不支持多层 代际结合 但是由于这些限制 这个问题真的让人头疼 像这样的困境真是让人束手无策 面对这种情况真是束手无策啊? 这个问题真的让人头疼
于是我只能完全复制一份jump方法, 并把所有的player改成monster:
void jump(Monster monster) {
//这里的代码只是例子
monster.setX(monster.getX() + 100)
monster.setY(monster.getY() + 500)
monster...
...半空中翻了三圈...
...手臂左边挥了一下, 再右边挥了一下...
...此处省去一万行代码....
...总之这个方法非常复杂, 很多...
...
}
Monster monster = new Monster()
jump(monster) 好了, 在这里我再调用jump方法, 完美实现了monster的跳跃
到此为止, 功能已经达到了预期目标, 但直接模仿这种方法这种模式肯定会存在严重的问题 这样的代码结构可能会导致严重的安全隐患
于是Sun公司的Java开发团队识别出该问题,并应用了一个修复补丁以解决接口接口的问题。
通过创建一个接口 Spirit{精灵} ,我们可以使 Player 和 Monster 成为其成员
interface Spirit {
int getX()
int setX(x)
int getY()
int setY(y)
}
//这是一个手机游戏里面的一个游戏角色
//它具有 x, y坐标
class Player extends A implements Spirit {
int getX() {...}
int setX(x) {...}
int getY() {...}
int setY(y) {...}
...
}
void jump(Spirit s) {
//这里的代码只是例子
s.setX(s.getX() + 100)
s.setY(s.getY() + 500)
s...
...半空中翻了三圈...
...手臂左边挥了一下, 再右边挥了一下...
...此处省去一万行代码....
...总之这个方法非常复杂, 很多...
...
}
class Monster extends B implements Spirit {
int getX() {...}
int setX(x) {...}
int getY() {...}
int setY(y) {...}
...
}
这样看来, 我们只需要一个同一的jump方法, 从而使得player和monster都能实现跳跃功能。
一来就增强了jump方法的可重用性。
完美地解决了代码冗余的问题。
正是实现了接口设计这一核心目标。
有人说, 接口是用来减少程序间的耦合性(无理取闹)。实际上, 它与耦合性并无关联
又有人说, 接口太强大(onsense)!
因为尽管它只是出于过于严格的Java设计而出现的一个小问题……它的主要目的就是提高方法间的重用性. 由于Java作为单继承语言依赖于接口才能正常运行
(请不要轻信那些胡扯大话: “伟大的接口”, “强大的接口”……这些都是经过精心设计的误导性言论, 目标读者群居然是孩子!)
虽然 interfaces 作为参数的模式具有更高的重用性,并非所有方法都需要采用 interface 作为参数的方式;实际上每个 interface 通常对应多段代码,在这种情况下不必过度依赖 interface 作为参数的方法;只有在必要时才建议采用这种方法;(Eclipse 提供了一个便捷的功能:可以从一个类中提取出其 interface,并且强烈推荐使用这种方法。
通过培养自顶向下的编码习惯, 你自然而然地就能透彻理解接口是什么. 此时, 你明白了接口的核心作用吗?
继续上面没吐完的槽
我对Interface(接口) 进行了深入研究 最终终于取得了一个重大的突破 那么您是否了解Interface的具体内容呢? 它的作用体现在哪些方面呢? 其重要性体现在哪里呢?
Interface代表的是一个高度抽象且复杂的体系结构。
Interface所扮演的角色就是暴露给外部系统的功能集合。
其主要目的并非如其所述地降低类与类之间的耦合程度。
其实际效果微乎其微。
尽管如此,这种做法却导致了大量新增的功能。
虽然如此,在这种设计下只能有一个父类别才能实现接口的设计理念吗?不不不不不不不!作为单继承机制的结果,界面被视为一种专有类型的引用。
在上文中提到"鉴于这个东西原本就是糟糕的状态后被Java语言所修补" "糟糕的状态"指的是什么:
C++语言是一个多继承语言,多继承带来了非常多的问题
所以Java发现这个问题后, 就决定做个单继承的语言
没想到单继承也有很多无法实现的功能
所以就加上了接口这个东西, 完美解决了之前无法实现的功能
有接口了, 代码又增多了...就这样, 糟不糟?
我们不应过分依赖接口来降低系统耦合度;或者换句话说, 二者之间并无直接关联
lady.on("fuck", function() {
bed.rock()
})
这是降低lady 和bed 间耦合度的非常好的办法!
最低限度地减少耦合依赖的核心理念在于:
避免在bed 类体中调用其内部属性
因为将另一个类体的属性插入到当前类体中
如果该类体内存在逻辑错误可能导致异常抛出,则会直接将异常传递给调用方
而这种强行嵌入的行为不仅违背了软件工程的基本原则
还会增加代码理解和维护的成本
因此建议采用更加开放的设计模式
使得各组件之间的交互更加透明自然
代码编写应当遵循自然直觉和常识性逻辑
在这段代码中...关于代码耦合度与接口的关系?完全没有关联!对比而言,在没有接口的语言中...无论是否有接口,在我的需求范围内
虽然 interfaces 对项目经理有一定作用, 但项目经理通常不会直接指示 you 实现 interface. 也就是说, you 只需根据他们的指示完成 interface 的开发工作即可在今天下班. (大多数项目经理不会这样做, 没有 interface 并不影响工作的分配.)
虽然接口的存在会增加代码复杂度,在某些情况下即使没有接口也能避免错误的发生。 我对 interfaces 使用频率很高,在实际应用中发现它们并未带来显著的优势。 简单语法的编程语言通常不需要依赖 interfaces 来实现功能。
我们看看其他语言的代码:
//这是一个手机游戏里面的一个游戏角色
//它具有 x, y坐标
class Player {
var x
var y
}
void jump(s) {
//这里的代码只是例子
s.x += 100
s.y += 500
s...
...半空中翻了三圈...
...手臂左边挥了一下, 再右边挥了一下...
...此处省去一万行代码....
...总之这个方法非常复杂, 很多...
...
}
class Monster {
var x
var y
}
player = new Player()
monster = new Monster()
jump(player)
jump(monster)
这些语言不需要为接口做任何事情, 这段代码就能顺利运行, 真是厉害!
开发者认为, 这种语言非常方便而且简单, 它不需要那些让人觉得奇怪的东西…
