如何彻底理解Java抽象类 为什么要用抽象类 什么情况下用抽象类

  呐,到底什么是抽象类,有时明明一个普通类就可以解决了,为啥非得整个抽象类,装逼吗

  我曾带着这样的疑惑,查了很多资料,看了很多源码,写了很多代码,以下是我的理解

 一、彻底理解Java抽象类 

  当我们无法理解一个事物的时候,我们得追寻他的根源:万物皆对象

  在面向对象的概念中,世间万物通过类来描绘的,但如果一个类中没有包含足够的信息来描绘一个具体的事物对象,这样的类就是抽象类。(参考 https://www.runoob.com/java/java-abstraction.html)

  无论你在其他渠道看到过多少关于抽象类的解释,都没有这样解释合乎根本!

  举个栗子

  (猪狗牛羊鸟器车 的例子就不要看了,都是一些教科书上没有任何实操意义的例子,看了你最终也不明白是啥玩意儿)

  让你设计一个简单的学生选课系统

  基本需求:学生选课,老师授课,每个老师只能接受有限个个学生,每个学生只能选一个老师。

  最终会抽象出其中2个领域对象:学生、老师。当我们用类去描述学生、老师时,他们的共性是人(Person):有名字、年龄、职业等特征,有上课(学习、授课都属于上课)等行为;

public abstract class Person {
protected String name;
protected int age;
protected int profession; public abstract void goToClass();
}

  呐,我们想想,光有这些特性、行为,就能完整的描述出一个可在选课系统,操作的对象(学生或老师)吗?显然不行!学生(Student)还需要:所选课程、选中的老师等其他特征;老师(Teacher)还需要:学生限数、名下学生等其他特征,加上这些东西,才能完整的描述一个可供操作的对象!所以 Person类理应作为抽象类,goToClass方法是子类必须重写的方法,表明子类是去学习的,还是上课的。

public class Student extends Person {
private int selLesson;
private int selTeacher; @Override
public void goToClass() {
System.out.println("偶是学生,偶来听课的");
}
}
public class Teacher extends Person {
private int studentNumLimit;
private List<String> students; @Override
public void goToClass() {
System.out.println("偶是老师,偶来讲课");
}
}

二、为什么要用抽象类 什么情况下用抽象类 

  1、根本原因:无法完整描述一个事物的类

  2、抽象类有一个特征,其抽象方法,必须在子类重写(子类非抽象类),所以,当我们父类的方法,必须要子类重写实现时,用抽象类。如上面的 goToClass() 方法,学生、老师去课堂的目的完全不同,必须自己实现。

  3、跟接口相比,接口的方法必须由实现类全部实现,接口方法比较多时,就会麻烦,而抽象类没有这样的限制。比如jdk 里面的 AbstractList,是ArrayList 的父类,里面全是方法,你只需要重写自己需要的

  4、易于理解,有时候,这样的设计,让人更容易理解它的层级等。个人认为所有的设计原则都是死的,为了提高代码的实操性,牺牲部分设计原则是可以的

如何彻底理解Java抽象类 为什么要用抽象类 什么情况下用抽象类的更多相关文章

  1. 什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

    什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

  2. iOS 在不添加库的情况下 通过抽象类来获取自己想要的方法

    #define SYSTEM_VERSION_MORE_THAN_BFDATA(v) ([[[UIDevice currentDevice] systemVersion] compare:v opti ...

  3. Tomcat启动报错java.net.AbstractPlainSocketImpl(java/net/AbstractPlainSocketImpl.java:178:-1)Struts在网络复杂情况下启动报错解决办法

    SSH项目 在网络复杂的情况(具体规律未知)下,Tomcat启动时,报如下错误: [ERROR] 2014-08-12 14:52:58,484 [org.apache.struts2.dispatc ...

  4. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  5. 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  6. [转载]深入理解JAVA的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  7. 深入理解Java的接口和抽象类 _摘抄

    http://www.cnblogs.com/dolphin0520/p/3811437.html 原文 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可 ...

  8. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  9. 【转】深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

随机推荐

  1. CSPS模拟 51

    蒟蒻由于仍然苟活在$1jf$,不得不接受省选题的吊打$QWQ$ 蒟蒻由于拿了大神们不屑打的弱智暴力,而大神们$T3$的各种快速变换没调出来,所以拿到辽人生第一个$1jf$黄名 既侥幸又$kx$ T1 ...

  2. 带你上手一款下载超 10 万次的 IDEA 插件

    作者 | 倪超(银时) 阿里云开发者工具产品专家 本文整理自 11 月 7 日社群分享,每月 2 场高质量分享,点击加入社群. 导读:Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效 ...

  3. python学习之【第十二篇】:Python中的迭代器

    1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭 ...

  4. 安利一个绘制指引线的JS库leader-line

    前言 之前看到一篇推荐Magi这个搜索引擎的新闻,对于这个搜索引擎是否好用咱们不予置评,但是我在这个搜索引擎上面发现了一个好玩的前端功能. 如上图,将鼠标浮动到学习来源上时,会展示一堆指引线. 本博客 ...

  5. javascript iframe跳转问题

    javascript iframe跳转问题如果在iframe里面有要点击跳转最外层的连接 要只能用<pre> <div onclick="parent.location.h ...

  6. linux-mysql8的安装步骤详解及需要注意的坑

    (本文由言念小文原创,转载请注明出处) 前言 最近安装mysql8时,遇到了一些问题,记录下来作为以后操作指导资料. Linux上mysql安装方法个人目前使用的有两种: 一种是基于rpm安装: 另一 ...

  7. 使用 Scrapy 爬取去哪儿网景区信息

    Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘.监测和自动化测试.安装使用终端命令 pip install Scrapy ...

  8. [ASP.NET Core 3框架揭秘] 文件系统[2]:总体设计

    在<抽象的"文件系统">中,我们通过几个简单的实例演示从编程的角度对文件系统做了初步的体验,接下来我们继续从设计的角度来进一步认识它.这个抽象的文件系统以目录的形式来组 ...

  9. pat 1046 Shortest Distance(20 分) (线段树)

    1046 Shortest Distance(20 分) The task is really simple: given N exits on a highway which forms a sim ...

  10. hdu 1556 Color the ball (树状数组)

    Color the ballTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...