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

短命女 2022-11-06 10:50 222阅读 0赞

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

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

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

一、彻底理解Java抽象类

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

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

举个栗子

(猪狗牛羊鸟器车 的例子就不要看了,都是一些教科书上没有任何实操意义的例子)

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

基本需求:学生选课,老师授课。

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

public abstract classPerson {protectedString name;protected intage;protected intprofession;public abstract voidgoToClass();

}

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

public class Student extendsPerson {private intselLesson;private intselTeacher;

@Overridepublic voidgoToClass() {

System.out.println(“偶是学生,偶来听课的”);

}

}

public class Teacher extendsPerson {private intstudentNumLimit;private Liststudents;

@Overridepublic voidgoToClass() {

System.out.println(“偶是老师,偶来讲课”);

}

}

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

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,222人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JAVA抽象抽象方法

    类的继承的作用主要在于可以扩充已有类的功能,子类继承后可以任意选择是否实现父类的方法,想实现就实现,不想实现就不实现。换句话说,父类无法对子类是否实现自己的某个方法做强制的约定

    相关 java抽象抽象

    先来说一下抽象与接口的区别:抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。 jav

    相关 Java为什么使用抽象

    抽象类  抽象类与接口紧密相关。然接口又比抽象类更抽象,这主要体现在它们的差别上:1)类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接

    相关 java-抽象

    抽象类 怎样理解抽象类: 打个形象的比喻: 我们以前定义一个动物类,动物有吃的行为,但是我们没有指定这是哪个动物(不是一个具体的事物),而且动物吃的行为也不知道是哪种

    相关 理解Java抽象抽象方法

    在面向对象中,所有的对象都是通过类来描述的。 但是并不是所有的类都用来描绘对象。 当一个类的属性不足以描绘一个对象的时候,这个类就是抽象类。 由于抽象类不包含实例对象