如何彻底理解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. Centos7下安装nexus3.x 安装

    1.官网下载unix版本 2.上传到linux系统的/usr/目录下 [root@lmll70op-ne ~]# cd /usr/ [root@lmll70op-ne usr]# ll 3.解压,并重 ...

  2. dp的林林总总(持续更新,dp骚气解法等等)

    写在前面: 本人dp较弱,所以总结了一些坑点,转化思路以供复习使用,勿喷,甚至一些不是dp的题(贪心等等)也会放在这. 每个点后面会有我自己的题解,如果没有链接,向下找第一个链接,可能会有多题. 1. ...

  3. winds添加静态路由

    如上图所示,wan口设备箱访问路由器栏口设备 route -p add 192.168.21.0 mask 255.255.255.0  192.168.0.176 -p 表示永久路由,重启后不丢失 ...

  4. 访问控制列表ACL

    1.ACL Access list ,访问控制列表. 2.作用 限制网络中的地址访问. 3.主要内容 Eg: Router(config)#access-list ? <一>. <1 ...

  5. Jenkins集群下的pipeline实战

    关于Jenkins集群 在<快速搭建Jenkins集群>一文中,我们借助docker快速搭建了Jenkins集群,今天就在这个集群环境中创建pipeline任务,体验Jenkins集群下的 ...

  6. ThinkPHP的主从数据库配置

    Thinkphp 框架本身是支持读写分离的,如何做呢?   最简单的做法是在配置文件中修改:   PHP代码 'DB_TYPE'=> 'mysql', 'DB_DEPLOY_TYPE' => ...

  7. [javascript] 编写一个计算器,实现加减法

    1.代码 <script> function sum(){ //加法 var value1 = document.getElementById("num1").valu ...

  8. WordPress 添加title中的logo

    WordPress 添加title中的logo <!--网页标题左侧显示--> <link rel="icon" href="/favicon.png& ...

  9. 领扣(LeetCode)用队列实现栈 个人题解

    使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作 ...

  10. easyui+ef实现省市区三级联动

    1.引用easyui样式及脚本文件 2.数据库创建表(自联表)及数据建模(Code First) use DataBase go CREATE TABLE OP_SJ ( CID UNIQUEIDEN ...