标签:style blog color ar os 使用 java sp strong
0.0 为什么会有接口和抽象类
假设一个任务:要写一个公司员工管理的软件。如果这个公司所有的人都是普通员工,没有任何职位和岗位区别,那就定义一个职工类即可。
class employee{ private String name; private int age; private Sting address; public String getAddress(){ return this.address; } }
这就是一个具体类。
现在问题来了,公司有不同等级的不同部门的员工,按照常理,直接继承这个类即可。但是,又有一个需求:IT部门的岗位员工的地址
不能直接访问。意思就是,IT部门的和其他部门的员工在getAddress()这个方法上的实现是不一样的。按照我的思路就是:那就方法重写
不就完了。嗯。可以。
但是!如果IT部门继承了这个employee类,结果getAddress()方法忘写了....程序不会给出提示错误,软件写完之后,就傻了...IT部门
的地址都特么的显示出来了。
如果用抽象类呢?那继承它的子类就必须实现这个方法,要不然程序会提示错误。
这个例子不算糟糕,再举个更糟糕的例子:草鱼的做法有很多种,红烧、清炖、酸菜、清蒸、糖醋...
如果写一个具体类GrassCarp,然后再定义一个cook()方法,这时候,你就必须得实现这个方法(也就是说你必须写一种做法进去),要么
你就得把所有的做法都写在这个类里面,cook_qingzheng(); cook_suancai();......
如果现在把它定义成一个抽象类呢?就只需要定义一个abstract cook();即可,需要酸菜鱼的时候,就 class SuancaiFish extends GrassCarp{}
然后实现cook方法即可。放心,如果你忘了,系统是会提示的。
接下来说接口。假设一个任务:电子商务平台的订单处理这块业务,包括:添加订单、取消订单和订单清算(这特么的要是抽象成具体的东西,还
真是不容易啊...这看上去是一个动作集合而不是实体集合啊!!!)。而且,不同类别产品的订单在“添加订单、取消订单和订单清算”时处理方式不一样。
举例啊,比如书籍类在取消订单的时候要扣5%的手续费,而电子音乐类不用。这时候你写一个具体类试试?
不用继承的话,你得多写多少代码啊...所以,这时候接口就出现了!可以理解接口为:一套动作的组合。先不写方法怎么实现的,先写出这个方法来,
然后再去实现这些方法,交给后面实现这个接口的那些类。
1.1 什么是抽象类
抽象类就是对一系列看上去不同,但是本质相同的具体事物们的抽象。就像:梨树、枣树、松树-----抽象----->树。要是让你具体描述一下树,谁能描述
的具体呢?但是梨树、枣树和松树的本质还是一样的,都是树。
1.2 抽象类的使用
跟具体类不一样,定义如下:
abstract class Tree{ public int age;//可以有普通成员变量 public abstract void grow(){ //抽象方法 } public abstract int getAge(){ //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现 return age; } }
继承如下:
class TaoTree extends Tree{ @Override public void grow(){ System.out.print("我是桃树,我会开花,我能结果"); } }
class SongTree extends Tree{ @Override public void grow(){ System.out.print("我是松树,我不会开花...T_T"); } }
1.3 抽象类的注意事项
包含一个或多个抽象方法的类必须定义为抽象类!否则,用户在调用这个抽象方法的时候,系统该骂了:你用这个方法,你特么的倒是给实现以下啊!!!
抽象类不能被实例化。你想做也做不了的。
2.1 什么是接口
Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,
而这些实现可以具有不同的行为(功能)。假设一个任务:定义一个Door的类,每个门都有开和关的功能,这属于它的固有属性。现在要给门一个报警的功能,
那报警的功能算是门的固有属性吗?如果你把报警写进了Door里面,那如果有的门不能报警,你还能继承这个Door类吗?
那就不如把报警、窥视、按铃这些功能写进接口里。如果有这个功能的们,就继承一下这个接口。
看,接口就是一套行为的模板,有这些行为发生的时候,就实现这个接口。
2.2 接口的使用
使用很方便,用上面门的例子:
Interface Alerm{ public void doAlerm(); }
找个门继承一下:
class Mydoor implements Alerm{ public void doAlerm(){ System.out.print("有坏人!有坏人!"); } }
就这么简单。
2.3 接口的注意事项
接口中定义的成员变量,只能是static final 的。先说一下,接口中一般不需要成员变量。不过,为什么必须是static final 的呢?假设不是static的,
然后一个类可以实现好几个接口,这样一来,两个接口有相同的变量,你咋办???假如不是final的,这个接口里面的方法没有一个能够修改它,因为
都是抽象的嘛!然后你要修改了这个静态变量,那实现这个接口的所有类只要用到这个变量的值都会被修改...那都这么统一了,干嘛不用抽象类去呢?
3.0 接口和抽象类的区别
这本质是个关于设计思想上的问题。
先说语法上的:
抽象类就像父亲,每个实现它的子类只能继承一个抽象类。而可以继承多个接口。接口就像情人,可以同时多交几个(如果你三观不正外加肾功强大)。
抽象类可以有具体的成员变量以及非抽象方法。接口只能有static final 的成员变量以及所有方法都要抽象。如此来看,接口要比抽象类还要抽象。
再说思想上的:
....待续
标签:style blog color ar os 使用 java sp strong
原文地址:http://www.cnblogs.com/warmer/p/4088627.html