普通类能做到的,需要接口干嘛?

lotte198666 2020-10-29 10:01:23
interfacePerson{
void eat();
void sleep();
}

class Studentimplements Person{
public void eat(){
System.out.println("学生去食堂吃饭!");
}
public void sleep(){
System.out.println("学生回寝室睡觉!");
}
}

class Teacherimplements Person{
public void eat(){
System.out.println("教师去教工餐厅吃饭!");
}
public void sleep(){
System.out.println("教师回学校公寓睡觉!");
}
}
class Parents implements Person{
publicvoid eat(){
System.out.println("家长去招待所饭馆吃饭!");
}
public void sleep(){
System.out.println("家长回招待所睡觉!");
}
}

public class PersonInterface{
public static void main(String[] args)
{
Person p=new Student();
p.eat();
p.sleep();
p=new Teacher();
p.eat();
p.sleep();
p=new Parents();
p.eat();
p.sleep();
}
}







程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!



现在需要添加一些功能,即现在需要添加“外宾、上级领导”两类角色,并且以后工具需要还要添加相应的身份角色的人进来,此时,只需要根据需要添加“外宾”类、“领导”类,而主类仍然可以拿来就用,无需进行更多的修改。此时就可以显示出接口的作用了。

在上面的程序中添加如下两个类即可。



class Foreign implements Person{
publicvoid eat(){
System.out.println("外宾去酒店吃饭!");
}
public void sleep(){
System.out.println("外宾回酒店睡觉!");
}
}

class Leader implements Person{
publicvoid eat(){
System.out.println("领导去宾馆吃饭!");
}
public void sleep(){
System.out.println("外宾回宾馆睡觉!");
}
}







而主函数中用法仍然一样。



下面给出完整的代码:



interfacePerson{
void eat();
void sleep();
}

class Studentimplements Person{
public void eat(){
System.out.println("学生去食堂吃饭!");
}
public void sleep(){
System.out.println("学生回寝室睡觉!");
}
}

class Teacherimplements Person{
public void eat(){
System.out.println("教师去教工餐厅吃饭!");
}
public void sleep(){
System.out.println("教师回学校公寓睡觉!");
}
}
class Parents implements Person{
publicvoid eat(){
System.out.println("家长去招待所饭馆吃饭!");
}
public void sleep(){
System.out.println("家长回招待所睡觉!");
}
}
class Foreign implements Person{
publicvoid eat(){
System.out.println("外宾去酒店吃饭!");
}
public void sleep(){
System.out.println("外宾回酒店睡觉!");
}
}

class Leader implements Person{
publicvoid eat(){
System.out.println("领导去宾馆吃饭!");
}
public void sleep(){
System.out.println("领导回宾馆睡觉!");
}
}

public class PersonInterface{
public static void main(String[] args)
{
Person p=new Student();
p.eat();
p.sleep();
p=new Teacher();
p.eat();
p.sleep();
p=new Parents();
p.eat();
p.sleep();
p=new Foreign();
p.eat();
p.sleep();
p=new Leader();
p.eat();
p.sleep();
}
}







程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

外宾去酒店吃饭!

外宾回酒店睡觉!

领导去宾馆吃饭!

领导回宾馆睡觉!


我把接口换成普通类,有实体方法,下面子类继续重写,效果一样,那为什么要接口呢?
...全文
2340 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
是赵敢敢啊 2020-11-24
  • 打赏
  • 举报
回复
存在即合理。
alexzshl 2020-11-24
  • 打赏
  • 举报
回复
与其去解释interface的设计理念,不如对照一下现实世界来理解. 人是抽象类, 女人是子类, 女人要实现自一个功能"生孩子"怎么办?回到Person里面定义显然不合适, 接口这时候更符合逻辑思维(简直就是水到渠成,用类反而"不伦不类"), 实现一个"生孩子able"接口,当然还可以实现(搭配)更多特定的功能, 这也符合"要扩展,不要修改"的设计理念. 以上仅仅是我的一点浅显的理解
Vicali 2020-11-21
  • 打赏
  • 举报
回复
很简单,在模板方法设计模式中,当一个模式的步骤是固定的时候,我只需要写一个有固定步骤的接口,当我需要用到这些固定的步骤我只要实现接口并重写就可以了,这样我就不用每次再写这些步骤。你看我写的模板方法设计模式,你就知道接口在这个设计模式中起了多大的作用。
fly4free 2020-11-19
  • 打赏
  • 举报
回复
一个项目任务分解的时候,有联系的功能模块涉及的多方人员怎样才能合作的愉快呢?
那就是面向接口编程。
“我”是按照接口标准 调用 or 实现的,最后联合调试完事儿。

而且有了各种接口也可以方便单独拿出来说事儿。
当然也不尽是“这有个 interface1, 那儿有个interface2的方法Xxx()……”,而是啥模块能干什么,啥功能要X模块实现——等等,需要用到哪儿,就拿过来变换一下形式就能用。
huangxingzhou 2020-11-19
  • 打赏
  • 举报
回复
用接口和用类来解决问题,就比如,要吃饭了肚子饿了,可以吃中餐或西餐。有两个选择。 用中餐来解决饥饿,还要西餐干什么?? 多个方法就多个解决问题的方式。 难道吃中餐就饱了,就要让西餐消失吗?没这个必要吧????
qkniit 2020-11-19
  • 打赏
  • 举报
回复
好好看看设计模式
  • 打赏
  • 举报
回复
接口可以多实现,你父类继承能继承几个?接口没有局限性,就是因为继承只能继承一个才有的接口
Defonds 2020-11-18
  • 打赏
  • 举报
回复
抽象、集中 面向对象的基础
wenoxy 2020-11-17
  • 打赏
  • 举报
回复
接口这玩意一般真用不上
堂风 2020-11-02
  • 打赏
  • 举报
回复
再说一下接口和基类的区别。 最主要的区别,就是一个实现了方法,一个没有实现。 上面说到了,也举例了,我们的场景中,需要的是一种约定,而并非一种默认的实现。 放到代码里面来说的话,就是使用基类会引入开发上的风险。 因为一旦有人忘记重载,那么会自动执行基类的方法,而导致未知的风险。 而接口只是一种约定,并没有实现,则不存在这个问题。
堂风 2020-11-02
  • 打赏
  • 举报
回复
大家讨论的挺热闹,我也谈下我的理解。 个人认为接口最主要的意义在于 约定。 就是我们约定了一个类一旦继承了了这个接口,那么他就一定遵循了我们的约定。 那么我们就可以按照约定,提前(在对应的类未实现之前)进行调用,而不必关心它内部的实现。 例如: 我们 以后 要做一些插件类,这个插件类会启动,会销毁。 当我们点击按钮之后,会验证权限,加载插件,执行插件,然后销毁插件。 那么这个功能怎么实现,或者说怎么设计呢。 这时候就需要用到接口。 做主线开发的,和做插件开发的,就可以讨论出一个插件接口。 主线开发做点击,鉴权,然后使用 插件接口 的创建、销毁方法。 做插件开发的,继承插件接口,实现插件的创建、销毁方法。 伪代码: Interface IPlugin start(); stop(); 主线: doSomething(); IPlugin plugin = pluginFactory.createPlugin(); plugin.start(); plugin.stop(); doSomething(); 插件 PluginA : IPlugin start(){xxxx} stop(){xxxx} PluginB : IPlugin start(){xxxx} stop(){xxxx} 这样大家开一个会,就可以按照约定同时进行开发了。
混子还在路上 2020-11-02
  • 打赏
  • 举报
回复
有了接口,代码可以具备较强的移植性,这个项目用了,下个项目接着用。
冰思雨 2020-11-02
  • 打赏
  • 举报
回复
接口的用途,一般情况下是对操作的抽象,比如楼主例子中的人的行为:吃和睡。 如果只有这两个行为进行抽象的话,使用接口或抽象类或者基础的类,其实是都可以的。 为啥还要抽象成接口呢?因为Java语法中,继承是单一的,接口是多实现的。啥意思?就是说,一个类可以实现多个接口。 举个栗子: 如果再设计一个接口叫观众,一个接口叫演员。观众可以观看表演,并要求外国人实现类来实现观众的观看行为,而演员由学生来实现。 这种场景下,学生就可以实现Person和演员两个接口,外国人就可以实现Person和观众两个接口了。 既然原题有递进要求,我也来一个递进要求。 如果观众的行为要求领导也可以实现,演员的表演行为老师也能实现,那么,你只需要在领导的类里面再实现一下观众这个接口,同时添加一下观看的函数实现即可,老师这个类也是同理,再实现一下演员这个接口并添加表演这个函数的实现即可。对于其他的基础类,都不用再做什么更改。不是吗? 这个时候,就体现出来接口和基础类的区别了吧。 接口只是不同行为的一个汇聚抽象,有的人在设计的时候,一个接口一个行为函数,有的人在设计的时候,一类行为(多个同类型的行为)写在一个接口里面。 当然,还是推荐进行分类设计。
老紫竹 2020-10-30
  • 打赏
  • 举报
回复
抽象类也可以,只有方法没有实现。 是吧。 这其实是java的限制,如果一个类可以【继承多个基类】, 那么就不需要接口了。 因为【这些抽象基类】就是【接口】,就是换个说法而已。
lotte198666 2020-10-30
  • 打赏
  • 举报
回复
引用 10 楼 wangshutong0907 的回复:
我是这么理解的 你对象让你买一瓶阔落,一瓶雪碧,一瓶芬达。可以创建这三个接口,想买哪个就实现哪个接口。要是用类的话,买一瓶阔落是一个类,但是Java给你限制了,你只能拿一次(继承一个类)。你单买确实没什么区别,但是你要买可乐雪碧的话,你就只能跟老板说,让老板给你打包好(创建新类),但是你发现不是买可乐雪碧,而是要买可乐芬达。就又要创建一个了。可乐雪碧芬达就有其中可能了,万一你对象还可能想要牛奶,矿泉水,奶茶,啤酒等等。那创建的类就太多了


我的意思是把接口改成普通类,效果也是一样的,都是多态,子类还是自己写自己的,但最上面那个接口改成了普通类,与接口一样,只是普通类可以自己写方法,也就是说最上面的是普通类,下面子类继承他,多态调用和用接口是一样的效果,所以我问接口比普通类好在哪了
lotte198666 2020-10-30
  • 打赏
  • 举报
回复
我的意思是把接口改成普通类,效果也是一样的,都是多态,子类还是自己写自己的,但最上面那个接口改成了普通类,与接口一样,只是普通类可以自己写方法,也就是说最上面的是普通类,下面子类继承他,多态调用和用接口是一样的效果,所以我问接口比普通类好在哪了
maradona1984 2020-10-30
  • 打赏
  • 举报
回复
而且接口从编程的意义上来讲,是规范/约束,等你理解规范/约束的意义,就明白接口的意义,这个有点抽象很难描述,还是你自己去感悟吧.
maradona1984 2020-10-30
  • 打赏
  • 举报
回复
引用 8 楼 lotte198666 的回复:
[quote=引用 6 楼 医手 的回复:]原来你是这个意思啊。的确哦,从实现上来讲,用普通的父类来代替接口没毛病,在任何情况下都行得通。接口是显得有点多余。 接口的微弱优势是: 1. 可以防止不小心 new 了个父类来用。 2. 不用写抽像方法的关键字 3. 对于java来说还有很特别的一点,一个类可以实现多个接口,但一个类不允许继承多个父类。
就这么点优势啊[/quote] 可以实现多个接口就是最大的区别,这不是所谓的优势,当然这只是java的语法限制而已,就这点,除了接口,父类什么的都做不到,这不就行了?
limit、T 2020-10-30
  • 打赏
  • 举报
回复
我认为接口它是一种约束吧,有些事物都有的属性和行为时就会需要。强制他们都具备的这些属性和行为。但是这类事务又不能被详细的描述。因为他们的行为的过程可能也不同。所以就需要接口了!说到这里你会想到抽象类也可以啊?为什么要用接口呢。因为类只能继承一个,而接口可以多实现。
医手 2020-10-29
  • 打赏
  • 举报
回复
你只需要知道有接口这么一回事就可以了。 当你觉得接口是多余的时候,说明这个场景不适合使用接口。 当你遇到需要接口的场景时,你自然就会想起接口。 如果不是造很基础的轮子(例如:框架、引擎),大多数时候其实确实用不上接口。 假设现在我们来开发游戏。里面有100种装备(未来还会升级增加更多的新装备)装备可以增加主角的HP MP 速度 防御什么的。 假设每种装备都是不同的类,有装备E1 E2 E3... 然后主角的装备放到列表中,list=[e1,e2,e3]; 然后我们要让装备对主角产生影响 for(E e:list){ e.effect(hero); } 这时你就会发现E1 E2 E3需要实现接口E,并且E需要有个effect方法。 如果没有接口并且没有类的继承,这代码完全没法写了。
加载更多回复(11)

62,626

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧