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


      如何彻底理解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、易于理解,有时候,这样的设计,让人更容易理解它的层级等。个人认为所有的设计原则都是死的,为了提高代码的实操性,牺牲部分设计原则是可以的

  • 相关阅读:
    runas/cpau/lsrunase使用小结(以管理员运行指定程序)
    XP安装IIS来加载aspx页面(Web调用SAP数据)
    HTML Select 标签选择后触发jQuery事件代码实例
    文件夹设置“以前的版本”功能(配置卷影副本)
    AD域-让共享目录只显示用户有权限访问的文件夹
    <Bootstrap> 学习笔记一. 配置环境, 简单使用, 响应式表格, 响应式图片
    <Bootstrap> 学习笔记二. 栅格系统的使用
    <jQuery> <方法> 十九. each()方法(遍历方法)
    <jQuery> <方法> 十八. 移除事件, 触发事件, 事件对象(阻止冒泡, 阻止跳转)
    <jQuery> <方法> 十七. on注册事件的两种方式(简单事件和委托事件)
  • 原文地址:https://www.cnblogs.com/littlecarry/p/11939809.html
Copyright © 2020-2023  润新知