Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 342|回复: 0

[Java基础知识]很形象的接口的使用实例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:46:09 | 显示全部楼层 |阅读模式
    里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下。

        我们拿人和程序员举个例子。人是一个大类,程序员是继承自人的子类。看看这句话:人需要吃饭。这句话我们把“人”换成“程序员”,就是:程序员需要吃饭, 这样换不会有什么问题。现在我们反过来,把“程序员可以用计算机写程序”里边的程序员换成“人”,就是:人可以用计算机写程序。这样就不一定正确了,否则 问题可就大了,我们这些程序员只怕没得饭吃了。

        这个就是里氏代换原则:使用父类的地方肯定可以用它的一个子类来替换掉,但是使用一个子类的时候用它的父类来替换就不一定正确了。

    好,现在我们回到程序设计里边来。

    看看下面的程序:
       一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉  
      
       
       
         
       

         
       
      


      public interface 人{
       

       
       
       void 吃饭();
      
      
       
       
       void 睡觉();
      
    }
      

       
      
      

      public class 学生 implements 人{
      
      
       
       
       public void 吃饭(){
      
      
       
       
       
       
       
       
       //去食堂吃饭
      
      
       
       
       }
      
      
       
       
       public void 睡觉(){
      
      
       
       
       
       
       
       
       //回寝室睡觉
      
      
       
       
       }
      
      
       
       
       ...//其他特有方法,比如泡妞、打游戏
      
    }
      

       
      
      

      public class 老师 implements 人{
      
      
       
       
       public void 吃饭(){
      
      
       
       
       
       
       
       
       //回家吃饭
      
      
       
       
       }
      
      
       
       
       public void 睡觉(){
      
      
       
       
       
       
       
       
       //回家睡觉
      
      
       
       
       }
      
      
       
       
       ...//其它特有方法,比如为生儿育女传宗接代的历史使命努力等不足为外人道的事情
      
    }
      

       
      
      

      public class 学校{
      
      
       
       
       public void 开饭(人 ren){
      
      
       
       
       
       
       
       
       ren.吃饭();
      
      
       
       
       }
      

       
       
       
       public void 放学(人 ren){
      
      
       
       
       
       
       
       
       ren.睡觉();
      
      
       
       
       }
      
    }
      

       
      
      

      这里就用到了里氏代换原则,"开饭()"和"放学()"的参数都是人,那么这个地方如果换成学生和老师肯定也可以。
      

       
      
      

      人 a = new 学生();
      
    学校.开饭(a);
      
    学校.放学(a);
      

       
      
      

      这样执行的结果就是学生回寝室吃饭。
      

       
      
      

      人 b = new 老师();
      
    学校.开饭(b);
      
    学校.放学(b);
      

       
      
      

      这样执行的结果就是老师回家吃饭。
      

       
      
      

      为什么要这样写呢?这样写有什么好处呢?
      
    我在开饭的时候完全可以直接调用"学生.吃饭();"、"老师.吃饭();"啊。
      
    接着看。
      

      
    有一天,学校里来了第三种人,家长。
      
    家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。
      

      
    这个时候学校这个系统该怎么处理呢?
      

      
    如果原来没有定义"人"这个接口那就麻烦啦,所有用到人的地方代码都要改。
      
    现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。
      
    好,看代码:
      

       
      
      

      public class 家长 implements 人{
      
      
       
       
       public void 吃饭(){
      
      
       
       
       
       
       
       
       //下馆子
      
      
       
       
       }
      
      
       
       
       public void 睡觉(){
      
      
       
       
       
       
       
       
       //去旅馆睡觉
      
      
       
       
       }
      
      
       
       
       ...//其它特有方法,比如会见老师,晓之以钱,动之以利等等,不一而足
      
    }
      

       
      
      

      在调用的时候不需要修改任何代码,还和原来一样:
      

       
      
      

      人 c=new 家长();
      
    学校.开饭(c);
      
    学校.放学(c);
      

       
      
      

      轻松搞定家长的食宿问题!
      

       
      
      

      这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!
      

      

      

      不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!
      




      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 18:45 , Processed in 0.528130 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表