接口是什么?Interface是什么?Java Interface是什么?Java 接口是什么?

接口是什么?
Interface是什么?
Java Interface是什么?
Java 接口是什么?
什么是Java接口?
Java接口是什么?
Java接口有什么作用?
Java接口的作用是什么?
Java Interface有什么用?

面对这些疑惑, 相信这是绝大多数Java初学者的困惑
甚至我可以说有好多Java老司机都说不出来接口到底是什么? 有什么作用

懵圈有没有?
你疑惑就对了, 你懵圈是正常的,
因为这个东西本来就是一团糟后给Java语言打上的一个补丁
不好理解是正常的

相信你自己, 你疑惑一个东西的时候
说明这个东西并不是什么好东西
比如给你写一篇文章, 官话套话一大堆, 中心思想不知道在哪里
让你疑惑了, 这篇文章好吗? 答案肯定是不好

下面听我给你讲讲Java的接口到底是什么? 有什么作用? 为什么要用接口?

我对接口的理解:
接口是一个对象暴露给外部功能集
其实就是Java语法过于严谨而打的一个补丁

为什么这么说, 我给你看一个例子你就明白了:

假设我有这么一个类:


//这是一个手机游戏里面的一个游戏角色
//它具有 x, y坐标  宽度width, 高度height
class Player {

	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 {

	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 {

	int getX() {...}
	int setX(x) {...}
	
	int getY() {...}
	int setY(y) {...}

	...
}

Monster monster = new Monster()
jump(monster) 这里因为monster类型不匹配而报错, 不可以直接使用jump方法对monster实现跳跃

问题来了:
jump(monster) 这里因为monster类型不匹配而编译报错
我草jump代码一万行, 我昨天写了一整天加班到晚上23点才写完
我不可能重新写一个撒
于是我只能完全复制一份jump方法:

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的设计人员发现了这个问题,
并给这个问题打上了一个优雅的补丁: 接口Interface

我们可以定义一个接口 Spirit(精灵), 让Player和Monster都成为一个Spirit


interface Spirit {
	int getX()
	int setX(x)
	int getY()
	int setY(y)
}

//这是一个手机游戏里面的一个游戏角色
//它具有 x, y坐标  
class Player 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 implements Spirit {

	int getX() {...}
	int setX(x) {...}
	
	int getY() {...}
	int setY(y) {...}

	...
}

这样一来, 我们就只需要一个相同的jump方法, 就可以实现player和monster的跳跃功能了
完美的解决了代码重复的问题
这就是接口的核心作用
有人说, 接口是为了降低程序耦合度, 其实不是, 它跟耦合度其实没什么联系
又有人说, 接口强大, 但我觉得它只是Java设计过于严谨而打的一个补丁
养成自顶向下的编码习惯, 你自然而然就会理解接口是什么
到这里, 你明白接口的核心作用了吗?

继续上面没吐完的槽

我对Interface(接口) 做了深入研究
最终还是有了伟大的发现!
你们知道Interface到底是什么吗? 作用是什么吗? 作用有多大?

Interface 象征 : 严谨 + 繁琐

Interface是什么: 对象暴露给外部使用的功能集
Interface作用: 所谓的降低类和类耦合度, 我说事实并不是这样的
Interface作用有多大: 作用没多大

Interface 是严谨了, 但是它让Java代码量增多

我上面说到 “因为这个东西本来就是一团糟后给Java语言打上的一个补丁”
‘一团糟’ 说的是什么:

C++语言是一个多继承语言,多继承带来了非常多的问题
所以Java发现这个问题后, 就决定做个单继承的语言
没想到单继承也有很多无法实现的功能
所以就加上了接口这个东西, 完美解决了之前无法实现的功能
有接口了, 代码又增多了...就这样, 糟不糟?

我们不应该去依赖接口来降低耦合度, 或者说他跟耦合度根本沾不上边
想要降低程序耦合度, 我推荐大家应该多多使用一些设计模式:
这里我特别推荐一定要多多使用事件模式:

lady.on("fuck", function() {
	bed.rock()
})

这是降低ladybed间耦合度的非常好的办法!

降低耦合度的核心思想就是:
不要在bed类里面引用lady的对象
因为你在bed里面引用了lady的对象, 就相当于把一个lady插进了bed里面
lady哪里出了bug流了血可能把bed弄脏, 甚至把bed玩垮
而且你把lady插到bed里面也不符合客观事实, 想要把ladybed里面拔出来的时候就很难了
写代码要符合人的正常思维

在这段代码里, 代码的耦合度关接口什么事? 半毛钱关系都没有
没有接口的语言, 和Java这种有接口的语言比起来, 我总结了一下:
有没有接口这个东西, 都没关系, 都能完成我需要的功能

接口对项目经理还是有那么一点点用, 就是项目经理给你定义个接口, 叫你你你去给我把这个接口实现了今天就可以下班了
(没有接口不代表这个工作就分配不下去了)

有接口就是写起来复杂点, 不过没有接口我照样不会犯错误…
接口我用得很多,
但接口没给我带来的太大的好处, 真的没有
简单语法的编程语言,根本不需要接口

我们看看其他语言的代码:

  
//这是一个手机游戏里面的一个游戏角色
//它具有 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)

这些语言不必定义接口, 这段代码就可以正常运行, 是不是很厉害?
这个语言的开发者说, 咱们的语言方便简单, 不需要接口这种奇奇怪怪的东西…

发布了12 篇原创文章 · 获赞 3 · 访问量 1534

猜你喜欢

转载自blog.csdn.net/lc574907580/article/details/104715259