• Java-面向对象之(抽象类+接口)


    一、抽象类

    1、什么是抽象类

    向我们之前讲的类,比喻成了制造洗衣机的图纸,能够描述一个完整的洗衣机。
    如果现在有一个类,它不能完整的描述一个对象,不能完整的描述一个洗衣机,那么它就被称为抽象类。

    2、为什么会出现抽象类

    1. 如果一个类中的方法没有实际的代码块,没有具体的工作,具体的工作都是由重写这个方法中完成的,这个方法就被称为抽象方法,这个方法所在的类就被称为抽象类。
    2. 在继承体系下,有些方法必须要进行重写,并且调用方法时,必须调用重写的方法,如果再在调用的时候,方法没有重写,那么肯定会调用父类的方法,为了防止这一错误发生,所以就产生了抽象类,继承抽象类,必须要重写方法,以防止方法没有被重写,而造成错误。

    3、抽象类的语法

    语法都是大部分是依据抽象方法出现的:

    1. 抽象方法和抽象方法被abstract修饰,抽象方法默认被public修饰
    2. 抽象方法由于没有具体的工作,所以可以没有方法体
    3. 由于抽象方法没有具体的工作,所以抽象类必须要被继承,继承之后的类要重写里面的抽象方法
    4. 如果不想重写抽象方法,那么这个类也变成抽象类,因为这个类继承了抽象方法却没有重写,那么这个类也不能完整的描述一个对象
    5. 如果再有一个类,继承了这个继承了抽象类的抽象类,那么这个类必须要重写里面的抽象方法,出来混,迟早要还的,既然你有胆量写出抽象方法,就要做好被重写的准备!
    6. 抽象方法是要被重写的,所以不能被final,static,private修饰,要满足重写的规则(不熟悉重写的,看我上一篇关于面向对象之(封装+继承+多态)的文章)。
    7. 抽象类中可以有抽象方法,也可以没有抽象方法,抽象类不太严格,比较佛系。
    8. 由于具有抽象方法,使得这个类不能完整的描述一个对象,所以不能实例化,产生一个对象。
    9. 抽象类也是类,也有普通的成员变量和成员方法
    10. 抽象类中,由于不能实例化对象,也就不能初始化成员变量,所以我们可以自己写出构造方法,通过构造方法来初始化成员变量。

    二、接口

    1、什么是接口

    为了理解接口,抽象出一个生活中的例子:像你的笔记本上的usb接口,或者电源插口,如果你的数据线或者充电器插头,满足插口的协议,也就可以使用这个usb接口和电源插口。

    用Java知识去理解:usb接口和电源插口就是Java中的接口,接口就是一个规范,只要满足这个规范,就可以使用这个接口,接口就是多个类的公共规范,是一种引用数据类型。

    2、为什么会出现接口

    1. 为了解决Java中不能实现多继承的问题
    2. 为了解决在继承时,要关注类型,所以产生了接口
      继承和接口都为了实现代码的复用
      继承只能单继承,是子类只能继承一个父类,一个父类可以有多个子类,但当有子类需要的方法,父类中没有,并且由于是单继承,所以出现了接口,类可以实现多个接口。
      只要符合接口这个规范,就可以实现这个接口,不要担心类型,忽略类型。

    3、接口的语法

    接口是一个比抽象类更抽象的特殊的类

    1. 接口使用interface关键词定义
    2. 接口名使用大写的I开头,表示代表的是一个接口
    3. 接口中默认的方法是抽象方法,且必须要有抽象方法,默认使用public abstract修饰,不能有普通的方法
    4. 可以有default修饰的方法,也可以有static修饰的方法
    5. 接口中的成员变量必须是public static final修饰
    6. 由于有抽象方法,所以接口不能实例化出对象
    7. 由于接口中默认的方法是被public abstract修饰,变量是被public static final修饰,所以为了代码的简洁,修饰符可以隐藏不写。
    8. 在子类中重写接口中的抽象方法时,不能使用默认的访问修饰符,也就是default,因为接口中的方法的访问修饰符是public,所以为了满足重写的规则,必须是子类中重写的方法必须是public。
    9. 由于接口中的变量被就地初始化了,所以不需要构造方法和静态代码块
    10. 实现接口的子类必须重写接口中所有的抽象方法,如果不重写,就是抽象类,需要使用abstruct修饰。
    11. 类实现接口时,使用关键字implements实现
    12. 接口之间的继承使用关键字extens实现

    4、接口的特性

    1、接口之间的继承

    为了实现代码的复用,不用每一次都要调用好几个接口,接口与接口之间可以继承,并且一个接口可以继承好几个接口,一个类可以实现好几个接口,但一个类只能继承一个类。

    5、接口的应用

    三、抽象类和接口之间的区别

    四、Object类

    1、什么是Object类?

    人的祖先可能是炎黄大帝。
    Object类就可以看作炎皇大帝,类就可以看作人,所有类的祖先是Object类,Object类是所有类的父类,所以Object类的对象的引用可以接收任何一个类的对象的引用,然后发生向上转型和动态绑定。

    由于类只能继承一个类,所有当类继承了一个类之后,所以这个类就不会继承Object类,但被继承的类同样继承Object类。

    1、equals方法

    equals方法是Object类中的方法,用来判断两个数是否相等

    如果使用默认的Object类的equals方法去比较对象相不相等,比较的是这两个对象的引用相不相等,引用是代表地址的一组数,由于Java为了安全,是不会将内存地址暴露出来的,所以对地址加密了,所以两个对象的引用肯定不相等,默认的equals方法不符合我们的逻辑。
    所以应该在子类中重写equals方法,在equals方法体内编写符合我们逻辑的代码。

    例如:创建一个自定义类,人这个类,实例化出两个人这两个对象,赋予两个对象名字和年龄,现在要比较这两个对象相不相等,就要比较名字和年龄相不相等。

    手动重写equals方法:

    对两个对象进行比较的思路:

    一个对象的引用调用重写的equals,将另一个对象的引用作为参数传给equals

    第一点:有可能这两个引用指向的是同一个对象,所以直接对这两个引用进行判断,如果相等,就是引用的对象是同一个,直接返回true即可。
    第二点:有可能作为参数传给equals的引用和调用equals的引用的类型不是同一个类,也就意味着是对两个不同类型的对象在进行判断,那就没有可比性了。
    第三点:如果作为参数传给equals的变量没有存放引用,是个空引用,那么直接返回false
    第四点:最后传进去的引用都是正常的了,对名字和年龄进行比较,对名字进行比较也是调用equals,并且String类中也对equals方法重写,String类继承Object类,equals方法使用Object类接收参数,发生向上转型之后,才能调用String中重写的方法,名字是String类型的,String类型也是引用类型,和自定义类型一样。
    判断年龄,年龄是具体的数,所以对两个变量进行判断即可。

    使用idea编译器解放双手自动生成重写的方法:
    第一步:
    右击,点击Generate或者之间按快捷键:Alt+Insert
    在这里插入图片描述
    第二步:
    点击图中第五行,一路点击next即可。
    在这里插入图片描述

    2、hashCode方法

    3、toString方法

  • 相关阅读:
    day9.30
    SpringBoot自定义banner
    网站打不开的九个因素
    神经网络的数学方法及应用,神经网络的数学理论
    【漏洞复现】大华DSS视频管理系统信息泄露漏洞
    flink-sql所有表连接器-1.16
    Python输出当前路径
    gorm 自定义时间、字符串数组类型
    RabbitMQ高级知识点
    面试官:说一下MySQL事务隔离级别?
  • 原文地址:https://blog.csdn.net/weixin_53908084/article/details/126259177