如何完全理解Java抽象类 为何要用抽象类 什么状况下用抽象类 html
呐,到底什么是抽象类,有时明明一个普通类就能够解决了,为啥非得整个抽象类,装逼吗java
我曾带着这样的疑惑,查了不少资料,看了不少源码,写了不少代码,如下是自家的理解ide
1、完全理解Java抽象类 学习
当咱们没法理解一个事物的时候,我得追寻他的本源:万物皆对象spa
在面向对象的概念中,世间万物经过类来描绘的,但若是一个类中没有包含足够的信息来描绘一个具体的事物对象,这样的类就是抽象类。(参考 https://www.runoob.com/java/java-abstraction.html)设计
不管你在其余渠道看到过多少关于抽象类的解释,都没有这样解释合乎根本!code
举个栗子htm
(猪狗牛羊鸟器车 的例子就不要看了,都是一些教科书上没有任何实操意义的例子,看了你最终也不明白是啥玩意儿)对象
让你设计一个简单的学生选课系统blog
基本需求:学生选课,老师授课,每一个老师只能接受有限个个学生,每一个学生只能选一个老师。
最终会抽象出其中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("偶是老师,偶来说课"); } }
2、为何要用抽象类 什么状况下用抽象类
一、根本缘由:没法完整描述一个事物的类
二、抽象类有一个特征,其抽象方法,必须在子类重写(子类非抽象类),因此,当咱们父类的方法,必需要子类重写实现时,用抽象类。如上面的 goToClass() 方法,学生、老师去课堂的目的彻底不一样,必须本身实现。
三、跟接口相比,接口的方法必须由实现类所有实现,接口方法比较多时,就会麻烦,而抽象类没有这样的限制。好比jdk 里面的 AbstractList,是ArrayList 的父类,里面全是方法,你只须要重写本身须要的
四、易于理解,有时候,这样的设计,让人更容易理解它的层级等。我的认为全部的设计原则都是死的,为了提升代码的实际可操性,牺牲部分设计原则是能够的