【转+分析】JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?
老是在想为什么要引用抽象类,一般类不就够用了吗。一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。
看了下面的文章,明白了一点。
其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以没有必要再父类里写。当然你也可以把抽象类都写成非抽象类,但是这样没有必要。
而写成抽象类,这样别人看到你的代码,或你看到别人的代码,你就会注意抽象方法,而知道这个方法是在子类中实现的,所以,有个提示作用。
==============
问你个问题,你知道什么是“东西”吗?什么是“物体”吗? “麻烦你,小王。帮我把那个东西拿过来好吗” 在生活中,你肯定用过这个词--东西。 小王:“你要让我帮你拿那个水杯吗?” 你要的是水杯类的对象。而东西是水杯的父类。通常东西类没有实例对象,但我们有时需要东西的引用指向它的子类实例。 你看你的房间乱成什么样子了,以后不要把东西乱放了,知道么? 又是东西,它是一个数组。而数组中的元素都是其子类的实例。 --------- 上面讲的只是子类和父类。而没有说明抽象类的作用。抽象类是据有一个或多个抽象方法的类,必须声明为抽象类。抽象类的特点是,不能创建实例。 这些该死的抽象类,也不知道它有什么屁用。我非要把它改一改不可。把抽象类中的抽象方法都改为空实现。也就是给抽象方法加上一个方法体,不过这个方法体是空的。这回抽象类就没有抽象方法了。它就可以不在抽象了。 当你这么尝试之后,你发现,原来的代码没有任何变化。大家都还是和原来一样,工作的很好。你这回可能更加相信,抽象类根本就没有什么用。但总是不死心,它应该有点用吧,不然创造Java的这伙传说中的天才不成了傻子了吗? 接下来,我们来写一个小游戏。俄罗斯方块!我们来分析一下它需要什么类? 我知道它要在一个矩形的房子里完成。这个房子的上面出现一个方块,慢慢的下落,当它接触到地面或是其它方块的尸体时,它就停止下落了。然后房子的上面又会出现一个新的方块,与前一个方块一样,也会慢慢的下落。在它还没有死亡之前,我可以尽量的移动和翻转它。这样可以使它起到落地时起到一定的作用,如果好的话,还可以减下少几行呢。这看起来好象人生一样,它在为后来人努力着。 当然,我们不是真的要写一个游戏。所以我们简化它。我抽象出两个必须的类,一个是那个房间,或者就它地图也行。另一个是方块。我发现方块有很多种,数一下,共6种。它们都是四个小矩形构成的。但是它们还有很多不同,例如:它们的翻转方法不同。先把这个问题放到一边去,我们回到房子这个类中。 房子上面总是有方块落下来,房子应该有个属性是方块。当一个方块死掉后,再创建一个方块,让它出现在房子的上面。当玩家要翻转方法时,它翻转的到底是哪个方块呢?当然,房子中只有一个方块可以被翻转,就是当前方块。它是房子的一个属性。那这个属性到底是什么类型的呢?方块有很多不同啊,一共有6种之多,我需要写六个类。一个属性不可能有六种类型吧。当然一个属性只能有一种类型。 我们写一个方块类,用它来派生出6个子类。而房子类的当前方块属性的类型是方块类型。它可以指向任何子类。但是,当我调用当前方块的翻转方法时,它的子类都有吗?如果你把翻转方法写到方块类中,它的子类自然也就有了。可以这六种子类的翻转方法是不同的。我们知道'田'方块,它只有一种状态,无论你怎么翻转它。而长条的方块有两种状态。一种是‘-’,另一种是‘|’。这可怎么办呢?我们知道Java的多态性,你可以让子类来重写父类的方法。也就是说,在父类中定义这个方法,子类在重写这个方法。 那么在父类的这个翻转方法中,我写一些什么代码呢?让它有几种状态呢?因为我们不可能实例化一个方块类的实例,所以它的翻转方法中的代码并不重要。而子类必须去重写它。那么你可以在父类的翻转方法中不写任何代码,也就是空方法。 我们发现,方法类不可能有实例,它的翻转方法的内容可以是任何的代码。而子类必须重写父类的翻转方法。这时,你可以把方块类写成抽象类,而它的抽象方法就是翻转方法。当然,你也可以把方块类写为非抽象的,也可以在方块类的翻转方法中写上几千行的代码。但这样好吗?难道你是微软派来的,非要说Java中的很多东西都是没有用的吗? 当我看到方块类是抽象的,我会很关心它的抽象方法。我知道它的子类一定会重写它,而且,我会去找到抽象类的引用。它一定会有多态性的体现。 但是,如果你没有这样做,我会认为可能会在某个地方,你会实例化一个方块类的实例,但我找了所有的地方都没有找到。最后我会大骂你一句,你是来欺骗我的吗,你这个白痴。 把那些和“东西”差不多的类写成抽象的。而水杯一样的类就可以不是抽象的了。当然水杯也有几千块钱一个的和几块钱一个的。水杯也有子类,例如,我用的水杯都很高档,大多都是一次性的纸水杯。 记住一点,面向对象不是来自于Java,面向对象就在你的生活中。而Java的面向对象是方便你解决复杂的问题。这不是说面向对象很简单,虽然面向对象很复杂,但Java知道,你很了解面向对象,因为它就在你身边。
相关推荐
- Java基础 1.java的类型 2.String能被继承吗?为什么? 3.String, Stringbuffer, StringBuilder 的区别。 4.ArrayList 和 LinkedList 有什么区别。 5.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。 6.6.用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什么,他们内部原理分别是什么,比如存储方式, hashcode,扩容, 默认容量等。 7.有没有有顺序的 Map 实现类, 如果有, 他们是怎么保证有序的。 8.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。 10.反射的原理,反射创建类实例的三种方式是什么 11描述动态代理的几种实现方式,分别说出相应的优缺点。 11.final 的用途 12.谈谈访问修饰符 public、private、protected、def
- 面试题汇总 1.面向对象和面向过程的区别 2.Java的四个基本特性(抽象、封装、继承,多态) 3.重载和重写的区别 4.构造器Constructor是否可被override 5.访问控制符public,protected,private,以及默认的区别 7.String和StringBuffer、StringBuilder的区别 8.hashCode和equals方法的关系 9.抽象类和接口的区别 10.自动装箱与拆箱 11.什么是泛型、为什么要使用以及泛型擦除 12.Java中的集合类及关系图 13.HashMap实现原理 14.HashTable实现原理 15.HashMap和HashTable区别 16.ArrayList和vector区别 17.ArrayList和LinkedList区别及使用场景 18.Collection和Collections的区别 19.Concurrenthashmap实现原理 20.Error、Exception区别 21.Unchecked 22.Java
- 巨评-OO之接口-DAO模式代码阅读及应用. 1.1. StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同? 2.StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有? 3.使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。 4.尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处? 5.可选:编写一些使用DAO模式的代码。比如使用文件作为购物车存储底层
- Spring与MVC面试题 1. Spring是什么,好处有哪些,为什么要使用? 2. 解释一下什么是 AOP? 3. 解释一下什么是 IOC? 4. Spring有几种IOC容器,区别是什么? 5. Spring 有哪些主要模块? 6. 什么是SpringBean,有几种类型Bean? 7. Spring Ioc的注入方式? 8. Spring可以注入null和属性值包含特殊符号么? 9. Spring 中的内部Bean和外部Bean是什么? 10. Spring 中如何注入java集合? 11. Spring 支持几种 Bean 的作用域? 12. Spring 中的 Bean 是线程安全的吗? 13. Spring Bean 的生命周期? 14. 什么是Spring自动装配,Spring 自动装配 Bean 有哪些方式,怎么使用? 15. Spring Bean的注解有哪些? 16. Spring Aop的专业术语 17. jdbc template是什么?怎么使用 18. Spring 支
- java技术面试之面试题大全 Java 面试知识点总结 Java 方向如何准备 BAT 技术面试答案 (汇总版) 1.面向对象和面向过程的区别 2.Java的四个基本特性(抽象、封装、继承,多态) 3.重载和重写的区别 4.构造器Constructor是否可被override 5.访问控制符public,protected,private,以及默认的区别 7.String和StringBuffer、StringBuilder的区别 8.hashCode和equals方法的关系 9.抽象类和接口的区别 10.自动装箱与拆箱 11.什么是泛型、为什么要使用以及泛型擦除 12.Java中的集合类及关系图 13.HashMap实现原理 14.HashTable实现原理 15.HashMap和HashTable区别 16.ArrayList和vector区别 17.ArrayList和LinkedList区别及使用场景 18.Collection和Collections的区别 19.Concurrentha
- 接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么? (1)接口和抽象类有什么区别 (2)深入理解Java的接口和抽象类
- CLR Profiler 性能分析工具 (转) .Net的尽管拥有非常强大调试器,但也有很多局限性,只限于CLR之上,无法得之CLR的具体细节,而且在多线程上就显得很无力。CLR在运行中隐藏了很多细节,像.net语法糖上的一些细节可以通过reflector得知(.Net 很多api在不同的版本实现细节也有较大的改动)CLR的运行也可以通过一些工具得到。也许你会问为什么也知道这些细节呢?要知道.net也是有很多bug而且.Net中的BCL多数都是在CLR中实现的,通过他我们可以很清楚找到我们的代码是怎么运行的,快速的找到代码的运行瓶颈。 这类工具有很多,如vs自带的性能分析,Windbg,clr profiler。 vs自带的性能分析可以很快的找到瓶颈代码,而且支持多线程。Windbg就更彪悍了,不过使用起来就比较费劲,搭配sos,可以在运行时查看应用程序的一些状态,但没有另外的两种详细。这里主要要说的是CLR Profile了,他检测结果最为详细,不过致命检测会影响应用程序的运行速度而无法
- 5-互评-OO之接口-DAO模式代码阅读及应用 1. StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同? 2. StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有? 3. 使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。 4. 尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处?
- 201521123085 《Java程序设计》第14周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容。 2. 书面作业 1. MySQL数据库基本操作 2. 使用JDBC连接数据库与Statement 2.1 使用Statement操作数据库。(粘贴一段你认为比较有价值的代码,出现学号) 2.2 你认为使用JDBC操作数据库的套路是什么?有那几点需要注意。 3. PreparedStatement与参数化查询 3.1 使用PreparedStatement根据用户指定的查询条件进行查询。(粘贴一段你认为比较有价值的代码,出现学号) 3.2 批量更新-批量插入1000个学生,统计整个操作所消耗的时间。对比普通方法插入与使用executeBatch方法所消耗的时间。(使用JUint4测试,需要出现时间对比截图) 4. JDBCUtil与DAO 4.1 粘贴一段你认为比较有价值的代码,并说明为什么要摘取这段代码。出现学号. 4.2 使用DAO模式访问数据库
- java基础面试题 JDK和JRE有什么区别? ==和equals的区别是什么? 基本类型和包装类对象使用 == 和 equals进行比较的结果? 什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题? hashCode()相同,equals()也一定为true吗? final在java中的作用 final finally finalize()区别 finally语句块一定执行吗? final与static的区别 String对象中的replace和replaceAll的区别? Math.round(-1.5) 等于多少? String属于基础的数据类型吗? java中操作字符串都有哪些类?它们之间有什么区别?(或问String、StringBuffer、StringBuilder的区别) String、StringBuilder、StringBuffer的区别? 如何将字符串反转? String类的常用方法有哪些(几乎不会问,但是方法很多没事看一看) 普通类和抽象类有哪些区别? 接口和抽象类有
- Git超级实用使用教程
- 【JVM】jmap命令使用