抽象类与抽象方法,接口

最近又重新学习了抽象类,抽象方法,以及接口,似乎又深入理解了一些,也对面向对象的思想理解得更深了。
      
      我在百度搜了一下,找到了一个理解抽象类和抽象方法的文章,文章如下:
      问你个问题,你知道什么是“东西”吗?什么是“物体”吗? “麻烦你,小王。帮我把那个东西拿过来好吗” 在生活中,你肯定用过这个词--东西。 小王:“你要让我帮你拿那个水杯吗?” 你要的是水杯类的对象。而东西是水杯的父类。通常东西类没有实例对象,但我 们有时需要东西的引用指向它的子类实例。 你看你的房间乱成什么样子了,以后不要把东西乱放了,知道么? 又是东西,它是一个数组。而数组中的元素都是其子类的实例。 --------上面讲的只是子类和父类。而没有说明抽象类的作用。抽象类是据有一个或多个 抽象方法的类,必须声明为抽象类。抽象类的特点是,不能创建实例。 这些该死的抽象类,也不知道它有什么屁用。我非要把它改一改不可。把抽象类 中的抽象方法都改为空实现。也就是给抽象方法加上一个方法体,不过这个方法 体是空的。这回抽象类就没有抽象方法了。它就可以不在抽象了。 当你这么尝试之后, 你发现, 原来的代码没有任何变化。 大家都还是和原来一样, 工作的很好。你这回可能更加相信,抽象类根本就没有什么用。但总是不死心, 它应该有点用吧,不然创造 Java 的这伙传说中的天才不成了傻子了吗? 接下来,我们来写一个小游戏。俄罗斯方块!我们来分析一下它需要什么类? 我知道它要在一个矩形的房子里完成。这个房子的上面出现一个方块,慢慢的下 落,当它接触到地面或是其它方块的尸体时,它就停止下落了。然后房子的上面 又会出现一个新的方块,与前一个方块一样,也会慢慢的下落。在它还没有死亡 之前,我可以尽量的移动和翻转它。这样可以使它起到落地时起到一定的作用, 如果好的话,还可以减下少几行呢。这看起来好象人生一样,它在为后来人努力 着。 当然,我们不是真的要写一个游戏。所以我们简化它。我抽象出两个必须的类, 一个是那个房间,或者就它地图也行。另一个是方块。我发现方块有很多种,数 一下,共 6 种。它们都是四个小矩形构成的。但是它们还有很多不同,例如:它 们的翻转方法不同。先把这个问题放到一边去,我们回到房子这个类中。 房子上面总是有方块落下来,房子应该有个属性是方块。当一个方块死掉后,再 创建一个方块,让它出现在房子的上面。当玩家要翻转方法时,它翻转的到底是 哪个方块呢?当然,房子中只有一个方块可以被翻转,就是当前方块。它是房子 的一个属性。那这个属性到底是什么类型的呢?方块有很多不同啊,一共有 6 种之多,我需要写六个类。一个属性不可能有六种类型吧。当然一个属性只能有 一种类型。 我们写一个方块类, 用它来派生出 6 个子类。 而房子类的当前方块属性的类型是 方块类型。它可以指向任何子类。但是,当我调用当前方块的翻转方法时,它的
       子类都有吗?如果你把翻转方法写到方块类中,它的子类自然也就有了。可以这 六种子类的翻转方法是不同的。我们知道'田'方块,它只有一种状态,无论你怎 么翻转它。 而长条的方块有两种状态。 一种是‘-’, 另一种是‘|’。 这可怎么办呢? 我们知道 Java 的多态性,你可以让子类来重写父类的方法。也就是说,在父类 中定义这个方法,子类在重写这个方法。 那么在父类的这个翻转方法中, 我写一些什么代码呢?让它有几种状态呢?因为 我们不可能实例化一个方块类的实例,所以它的翻转方法中的代码并不重要。而 子类必须去重写它。那么你可以在父类的翻转方法中不写任何代码,也就是空方 法。 我们发现,方法类不可能有实例,它的翻转方法的内容可以是任何的代码。而子 类必须重写父类的翻转方法。这时,你可以把方块类写成抽象类,而它的抽象方 法就是翻转方法。当然,你也可以把方块类写为非抽象的,也可以在方块类的翻 转方法中写上几千行的代码。但这样好吗?难道你是微软派来的,非要说 Java 中的很多东西都是没有用的吗? 当我看到方块类是抽象的,我会很关心它的抽象方法。我知道它的子类一定会重 写它,而且,我会去找到抽象类的引用。它一定会有多态性的体现。 但是,如果你没有这样做,我会认为可能会在某个地方,你会实例化一个方块类 的实例,但我找了所有的地方都没有找到。最后我会大骂你一句,你是来欺骗我 的吗,你这个白痴。 把那些和“东西”差不多的类写成抽象的。而水杯一样的类就可以不是抽象的了。 当然水杯也有几千块钱一个的和几块钱一个的。水杯也有子类,例如,我用的水 杯都很高档,大多都是一次性的纸水杯。 记住一点,面向对象不是来自于 Java,面向对象就在你的生活中。而 Java 的面 向对象是方便你解决复杂的问题。这不是说面向对象很简单,虽然面向对象很复 杂,但 Java 知道,你很了解面向对象,因为它就在你身边。
    
    再谈谈接口。
    我们可以把usb接口类比于java中的一种接口,MP3,u盘....可以类比于实现了这种接口的具体的类;要使MP3和u盘插入usb后有反应,它们就都得符合usb接口都规范,就像java类如果要实现一个接口就得覆习接口中的所有方法,可以把接口中的方法看做一种规范。 
    再比如我们要写很多动物的类,我们可以不要接口,分别写出各个动物的类包括它们具有的属性和方法,当这样做是不好的。我们大可以写一个动物的接口,其中包括一些方法,比如说eat(),sleep(),walking()....,这些方法都是动物所具有的共性,因为所有动物都吃,都睡觉,都会走路。 
    再写动物的类时,就可以实现那个动物接口。但具体的动物他们吃,睡觉的方式又不同,这样就可以分别覆写出不同的方法。但这样让人感到更舒服,思路更清晰一些。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值