抽象类和接口的使用

开篇废话

入职后一直研究Android framework的东西,大概花了一个月鼓捣了一个系统应用“应用双开”。虽然也是敲代码,但是主要是在Android源码中进行修改,也可以说很久没用java去写一个完整的东西了。近来公司有个小工具需要开发,上头应该觉得功能很简单,所以让我一个人开发。具体功能需求不便透露,主要是一个windows应用。本来我打算用C#写,但是老大说最好用java,最终选了java swing来开发。这是一个很古老的东西,反正我也不熟悉,在大概学习了swing的组件使用之后,就开始动手coding了。

java思想

其实不管java也好,其他面向对象语言也好。面向对象的思想就是分工而治,统一管理。这里我就不吹逼面向对象了,毕竟能力有限,吹逼能力有限,道行尚浅。大家记住这几个字分工而治,统一管理

例如

说一千道一万,眼见为实耳听为虚。我写的工具中有这么一项需求。大致类似于,我要写满汉全席的食谱,总共一百零八道菜,每道菜都需要配图(UI)和做法(文本),最终写到一个册子中(文本汇总)。

需求分析:

1.一百零八道菜,每个菜都不同,应该对应着有108个类吧。
2.每道菜都需要配图和做法,对应着每个类都应该有一个pic()方法和cook()方法吧。
3.最终写到一个册子中。汇总:调用所有类的cook()方法,写到一个文本中。

代码设计

一定要记住,不要忙于写代码,而是搞清楚功能逻辑,不然写到一半改需求是真的很要命,我就吃了这个亏,好在我前期代码结构设计还算可以,不至于重头来过。

言归正传:108道菜,每道菜都不同,如果没有重样的菜,就意味应该有108个类。每个类都有pic()和cook()方法,说明这是共用类,汇总的时候去调用每个类的cook()方法。
按照道理讲功能的逻辑是这样没错了,如果这108类每个类都不一样的话,这108类看来是必不可少了,pic()和cook(),属于类的方法,无可厚非,但是汇总时,我总不能把每个类都实例化一遍然后去调用各自的cook方法吧。所以这时候,java的抽象类和接口就得派上用场了。抽象类和接口都是用于类的继承,抽象类只能单继承,接口可以多继承,这些基础的概念,想必大家都懂,不懂没关系,可以上网去查啊http://www.jianshu.com/p/038f0b356e9a
但是值得去讲的是:抽象类和接口中都是抽象方法,就是没有实现的方法,语法上支持你去调用这个方法,但是最终调用的是继承了该类或接口并实现了该方法的类。
所以:我们可以这样做,这些如何灵活运行接口和抽象类就看各自的本事了,我大致讲解一下我的做法。

首先我定义了一个抽象类
public abstract class Food {

    public String type = "";

    public Food() {
    }

    abstract public String cook();
    abstract public void pic();
}

其中有两个未实现的抽象方法,因为考虑到108到菜也分菜系,所以用了type变量用来标识菜系。
现在我们要做两个菜系的菜,粤菜,和川菜。不管他们是哪个菜系,但是他们都属于food,于是就呈现出一种继承关系。

然后定义粤菜类和川菜类:
public abstract class YueCai extends Food {

    public YueCai() {
        type = "YueCai";
    }
}
public abstract class ChuanCai extends Food {

    public ChuanCai() {
        type = "ChuanCai";
    }
}

因为他们是food类的子类,所以他们也含有food类的pic()和cook()方法。
既然要写成菜谱,那么我们是否应该有一个专门来写菜谱的人。

接着我们来定义cooker类
import java.util.List;

public class Cooker {

    private List<Food> foods = null;
    public Cooker() {
    }

    public void addFood(Food food) {
        foods.add(food);
    }

    public void write() {
        StringBuffer cookBook = new StringBuffer();
        for(Food food : foods) {
            cookBook.append(food.cook());
        }
    }
}

这里的cooker类,就是统一管理的类,首先是维护了一个List,类型是Food类,Food是抽象类,就是告诉大家,我这里要装的菜肴,但具体是什么菜,你实际放什么菜那就是什么菜,我这里不关心。
然后定义了add方法,用于往List中填充内容,write()函数,就是写菜谱了,循环遍历List<Food>,依次调用Food的cook方法。这里就解决了,108道,每道菜不同,不需要我分别调用这108个类的方法,因为我在这里统一调用了抽象类Food的抽象方法cook(),但是这个方法是未实现的方法,所以它最终调用的是实现了这个方法的类。那么到底哪个类实现了该方法,而又是如何才能调用到的呢。

上面写的所有的类都是代码结构的搭建,说白了就是一群只知道说,不去做事的家伙

那么我们来定义踏实干活的人吧

public class MapoDouFu extends ChuanCai{

    public MapoDouFu() {
    }

    @Override
    public String cook() {
        return "mapoDoufu";
    }

    @Override
    public void pic() {
        
    }

}

public class YanjuChicken extends YueCai {

    public YanjuChicken() {
    }

    @Override
    public String cook() {
        return "YanjuChicken";
    }

    @Override
    public void pic() {
        
    }

}

我们这里定义了两道菜的类,一个MapoDoufu,一个YanjuChicken。他们分别继承了ChuanCai类和YueCai类,而ChuanCai类和YueCai类都是继承自Food类,所以他们都是Food类的子类。并且都是Food类的最终实现类。

然后我们在合适的地方去调用Cooker的addFood()方法
Cooker cooker = new Cooker();
MapoDouFu mapoDouFu = new MapoDouFu();
cooker.addFood(mapoDouFu);
YanjuChicken yanjuChicken = new  YanjuChicken();
cooker.addFood(yanjuChicken);

这里就是java多态的体现,我们定义addFood()方法时,形式参数是Food类,但是在调用时实际传入的Food类的子类MapoDoufu和YanjuChicken类。所以当我们去调用wirte()时,也将调用的实际传入类的cook()方法。
这是简单的对抽象类一个应用场景的介绍,同样,接口也是可以这样使用的。原理是一样的,我这里就不复述了。

public interface Food {
    public void pic();
    public String cook();
}
public class YanjuChicken implements Food {

    public YanjuChicken() {
    }

    @Override
    public void pic() {
        
    }

    @Override
    public String cook() {
        return "YanjuChicken";
    }

}
public class MapoDoufu implements Food {

    public  MapoDoufu() {
    }

    @Override
    public void pic() {
        
    }

    @Override
    public String cook() {
        return "MapoDoufu";

}
public class Cooker {

    private List<Food> foods = null;
    public Cooker() {
    }
    public void write() {
        StringBuffer cookBook = new StringBuffer();
        for(Food food : foods) {
            cookBook.append(food.cook());
        }
    }
    public void addFood(Food food) {
        foods.add(food);
    }

}

至于type的作用,本篇没有体现出来,而是想告诉大家要有抽象分类的思想。

这里只涉及到接口和抽象类最基础的用法,还有回调,内部类等等的用法,这些东西也是很常用的,后续我会更新相关的文章,如有错误的地方,欢迎大家批评指正,不胜感激!如有疑惑的地方,也欢迎大家讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 01接口的概念 02接口的定义 03接口的实现类 04接口中成员变量的特点 05接口中成员方法的特点 06实现类还...
    葡小萄家的猫阅读 619评论 0 1
  • 你很清楚的知道什么时候用抽象类,什么时候用接口么?p.s. 多文字预警! 1 抽象类和接口简介 1.1 抽象类 ...
    Sharember阅读 2,343评论 9 55
  • 1、面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标...
    michaelgong阅读 805评论 0 1
  • 第一次使用简书,还不太清楚它会在我的生活中扮演什么角色,但是我深知行动是解决问题的最好办法。此刻,明天还要考试,我...
    jane1028阅读 126评论 1 0
  • 2017年8月23日早6点半,听完喜马拉雅的易效能100讲,我如以往打开印象笔记开始写晨间日记。今天开心的看到晨间...
    田园成长阅读 803评论 2 2