怎样生动的解释为啥java中要用抽象类?

我目前在改FlumeNG中的一个小模块 目的是为了将Source提供的原始输入转换为支持Hive映射的格式写的过程中我不知道输入谁去收集 所以我定义了一个接口 描述了我对输入实现的需求 然后去写我转换部分的代码在这个开发过程中 有一部分是有实现的 有一部分是停留在描述阶段的(抽象) 我可能会因为测试的缘故随便写个实现 但是"输入"的实现 不会影响我负责部分的流程也就是这么回事
■网友
http://zhidao.baidu.com/question/368003986
■网友
举个实际的例子吧:我做了一个系统,读取自己的图片数据源,然后提供给web使用。实现这个读取功能的类叫做TileSource。有一天,一个客户说,我们自己有数据源,不用你们的。于是我要怎么办呢?最笨的当然是把TileSource的实现改了,改成读他们的数据源。如果你这样想的话,建议立刻去看书。第二个办法是,再实现一个TileSource4C,然后引用这个类。但是你会想到,要是有好多个客户怎么办呢?那改代码不得改疯了?而且万一上层改了,每个版本都得动,还不累死?能不能都加载了,根据用户访问的内容或者通过配置文件来决定调用哪个呢?当然可以,把现在我有的各种TileSource都初始化了,然后根据具体情况调用不同的类。你看,这些TileSource是不是应该抽象出一个父类呢?但是这个父类其实并不直接被实例化,因为丫并不具体对应某一个数据源,它只是对这些访问数据源的所有类的一个抽象,你没法直接用它,所以它是一个抽象类。但是你要问了,不弄一个抽象父类,好像也没啥?对,目前看来影响不大。那我再给你说下一步,有一天你的客户说,我们数据源会变,到时候我们想自己改个TileSource可以不?你咋整?你初始化的时候怎么加载他新开发的类?ok,我们可以使用Class.forName对吧?在一个配置文件里面配置好所有要加载的类,然后动态加载进去。但是···靠,这个类是什么类型啊?你看,如果这个时候它们都有一个抽象的父类AbstractTileSource,是不是就解决了:AbstractTileSource ts = (AbstractTileSource) Class.forName("xxx").newInstance();所以,抽象类是很好用的。对了实际上这里我用的是接口ITileSource,至于接口和抽象类的区别,自己想想吧。
■网友
不是所有的入门书都会讲吗?你定义一个动物类,继承一个狗类一个猫类。你可以new一个狗类的实例,但你不能new一个动物的实例,因为不存在这样一个不属于任何子类的动物类实例。所以,动物类必须是抽象的。
■网友
个人觉得:在使用上,可以 理解 抽象类 是对 接口类的 一个 扩展;接口类是抽象类的一个子集;分析如下:
抽象类可以没有抽象方法:
某个类可以在不提供抽象方法的前提下,声明为抽象类 , 一旦一个类被声明为抽象类,就不能够被直接实例化;
抽象类和接口的区别:
区别: 子类只能继承一个抽象类,不能继承多个 子类可以实现多个接口 区别2: 抽象类可以定义 public,protected,package,private 静态和非静态属性 final和非final属性 ;
但是接口中声明的属性,只能是 public 静态 final的 即便没有显示的声明 ;
子类只能继承一个抽象类,但是可以继承多个接口类;
【怎样生动的解释为啥java中要用抽象类?】 注: 抽象类和接口都可以有实体方法。 接口中的实体方法(可以通过内部类实现),默认方法。

■网友
抽象类第一是为了抽象出一些公共的特性,然而不能直接实例化,里面的抽象方法必须重写,接口我的理解是此对象暴露给外面的某种能力,所以可以实现多个接口,在类型转换的时候,外部只能调用接口所提供的能力
■网友
具有一些公共的特性实体提取抽象,通过继承抽象实现多态抽象是针对一个实体,接口一般是针对行为抽象只能是单继承,接口可以实现多个从而实现多继承的效果


推荐阅读