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

本文探讨了Java接口的核心作用和本质,解释了为何接口是为了解决单继承问题而引入的,通过实例说明接口如何提高代码重用性,并反驳了一些关于接口的误解,建议在适当情况下使用接口以降低耦合度,同时推荐使用设计模式来优化代码结构。

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

相信这是绝大多数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类型不匹配而编译报错
我草jump代码一万行, 我昨天写了一整天加班到晚上23点才写完
我不可能重新写一个撒

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

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


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方法的重用性
完美的解决了代码重复的问题
这就是接口的核心作用

有人说, 接口是为了降低程序耦合度(什么鬼话)?不, 它跟耦合度没联系
又有人说, 接口强大(什么鬼话)?
它只是Java设计过于严谨而打的一个补丁,其目的是提高方法的重用性. 因为Java是单继承语言,如果没有接口,Java将无法正常使用
(不要去相信什么: “伟大的接口”, “强大的接口”… 这些花哨骗人洗脑写给小孩子看的广告词)

虽然接口作为参数的方法重用性更高,不代表你所有方法都要用接口来作为参数,毕竟多个接口多篇代码,大可不必过度使用,你有必要的时候再用不迟(eclipse自带从一个类抽取出接口的功能,推荐使用哟)

养成自顶向下的编码习惯, 你自然而然就会理解接口是什么
到这里, 你明白接口的核心作用了吗?

继续上面没吐完的槽

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

Interface 象征 : 严谨 + 繁琐
Interface 是什么: 对象暴露给外部使用的功能集
Interface 作用: 所谓的降低类和类耦合度, 我说事实并不是这样的
Interface 作用有多大: 作用没多大
Interface 是严谨了, 但是它让Java代码量增多
Interface 是单继承产物, 因为单继承, 所以必须必须要有接口

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

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

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

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

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

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

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

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

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

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

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

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

<think>首先,用户的问题是关于Java接口的定义。用户说:"我想了解Java接口的定义 请问Java接口的定义"。所以,我需要专注于解释Java接口的定义。 系统指令要求: - 使用中文回答。 - 所有行内数学表达式用$...$格式,但在这个上下文中,可能不涉及数学公式,所以我可以忽略。 - 独立公式用$$...$$格式,同样可能不适用。 - LaTeX语法正确:确保任何公式使用正确格式,但这里可能不需要。 - 生成相关问题:在回答末尾生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。引用来自提供的引用源。 用户提供了几个引用: - 引用[1]:描述接口作为引用数据类型,包含常量、方法签名和嵌套类型,不能包含实例变量或方法实现(除默认方法和静态方法)。 - 引用[2]:类似,强调接口只有方法的声明,没有实现,用于定义类的行为。 - 引用[3]:给出接口的基本语法。 - 引用[4]:提供接口定义的例子,包括关键点如属性是静态常量,方法是抽象方法。 用户指令还说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。" 但这是第一次问题,所以没有上一次问题。用户说:"参考用户上一次的问题和你的回答",但在这个对话中,这是第一个用户消息,所以我应该基于当前消息。 用户消息:"参考站内引用:引用[1]...引用[4]...",所以我需要参考这些引用。 现在,构建回答: - 结构清晰:逐步解释Java接口的定义。 - 使用中文。 - 结束时生成相关问题。 - 自然地添加引用标识。 回答结构: 1. **介绍什么是Java接口**:基于引用,解释接口是一个抽象类型,包含方法签名、常量等。 2. **详细定义**:包括语法、组成部分(如常量、方法签名、默认方法等)。 3. **关键点**:强调接口不能有实例变量,不能有方法实现(除特定情况)。 4. **引用来源**:在解释时,自然地添加引用标识,例如:"接口只能包含常量、方法签名和嵌套类型,不能包含实例变量或方法的实现[^1]。" 引用标识: - 引用[1]:提到接口包含常量、方法签名、嵌套类型,不能有实例变量或实现(除默认方法)。 - 引用[2]:强调接口只有方法特征,没有实现。 - 引用[3]:给出语法。 - 引用[4]:提供例子和细节如属性是静态常量。 我应该整合这些信息: - 定义:Java接口是一个抽象类型,类似于类,但只能包含常量、抽象方法签名、嵌套类型(Java 8+可以有默认方法和静态方法)。 - 语法:使用`interface`关键字定义。 - 目的:定义类的行为,允许多继承通过接口。 结束生成相关问题: - 类似于示例:"§§相关问题§§" - 例如: 1. Java接口和抽象类的区别是什么? 2. 如何在Java中实现一个接口? 3. Java接口的默认方法有什么作用? 确保回答真实可靠:基于提供的引用和标准Java知识。 完整回答提纲: 1. **开头**:直接回答Java接口的定义。 2. **解释**: - 接口是什么。 - 语法结构。 - 组成部分(常量、方法等)。 3. **总结**。 4. **相关问题**。 </think>### Java接口的定义 在Java中,接口Interface)是一种抽象引用数据类型,它用于定义类(Class)必须实现的行为规范,而不提供具体的实现细节。通过接口Java支持多继承(一个类可以实现多个接口),从而使不同类的对象能够以统一的方式交互。以下是基于引用来源的详细解释: 1. **接口的基本概念**: 接口类似于类,但它只能包含常量(静态常量)、方法签名(抽象的实例方法)、嵌套类型(如内部类或接口)。关键的约束是:接口不能包含实例变量或方法的具体实现(例如,不能有字段或方法体)。不过,从Java 8开始,接口可以定义默认方法(`default`关键字)和静态方法(`static`关键字),这些方法可以有实现;Java 9引入了私有方法。这允许接口在保持抽象性的同时,提供一些默认行为[^1][^2]。 2. **接口的语法结构**: 接口使用`interface`关键字定义,并通过`extends`继承其他接口。基本语法如下: ```java [修饰符] interface 接口名称 extends 父接口1, 父接口2, ... { // 静态常量(public static final修饰,通常省略) [常量声明]; // 例如:int MAX_VALUE = 100; // 抽象的实例方法(方法签名,public abstract修饰,通常省略) void methodName(...); // 例如:void add(String name); // 可选:默认方法(Java 8+) default void defaultMethod(...) { ... } // 可选:静态方法(Java 8+) static void staticMethod(...) { ... } // 可选:私有方法(Java 9+) private void privateMethod(...) { ... } } ``` 例如,一个简单的用户服务接口定义: ```java public interface UserService { // 静态常量(等效于 public static final) int AGE = 99; // 抽象方法 void add(String name); void delete(String name); } ``` 在这个例子中,`AGE`属性是隐式的静态常量,所有方法都是抽象的(只有声明,没有实现)[^3][^4]。 3. **接口的核心特点**: - **抽象性**:接口主要用于声明方法的签名,而不提供具体实现。实现类(使用`implements`关键字)必须覆盖这些方法。 - **多继承支持**:一个类可以实现多个接口,但只能继承一个类,这解决了Java单继承的限制。 - **行为约束**:接口定义了“契约”,确保实现类遵守相同的行为规则,例如在API设计或回调机制中广泛使用。 - **演进兼容性**:从Java 8起,默认方法允许接口添加新功能而不破坏现有实现类[^1][^2]。 总之,Java接口的核心是提供一个纯粹的抽象层,用于规范类的公共行为,促进代码的灵活性和重用性。它在面向对象编程中扮演着关键角色,尤其在模块化设计和API开发中[^1][^2][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值