• 【Java】抽象类和接口


    1. 抽象类

    1.1 抽象类的概念

    • 所有的对象都是通过类来描述的,但是反过来不是所有类都可以描述对象。
    • 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

    1.2 抽象类的语法

    abstract 关键字

    • 在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
    • 注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

    1.3 抽象类的特性

    • 1. 抽象类不能直接实例化出对象
    • 2. 抽象方法不能是 private 的
    • 3. 抽象方法不能被 static 和 final 修饰 -- 因为子类需要重写抽象方法
    • 4. 抽象类必须要被继承,并且继承后的子类需要重写父类的抽象方法,否则子类也是一个抽象类,需要被abstract进行修饰
    • 5. 抽象类中不一定有抽象方法,当时抽象方法一定属于抽象类
    • 6. 抽象也有构造方法,供子类创建对象的时候,初始化父类的成员变量

    1.4 抽象类的作用

    • 抽象类与普通类相比 -- 多了一层编译器的校验

    2. 接口

    2.1 接口概念

    • 接口就是公共的行为规范标准,只要符合规范标准,就可以通用。
    • 在Java中,接口是:多个类的公共规范,是一种引用数据类型。

    2.2 语法规则

    interface 关键字

    • 接口的定义和类 类似,只需要将 class 换成 interface 关键字即可
    • 提示:
      • 1. 创建接口时,接口名字一般以 大写字母 I 开头
      • 2. 软性要求:最好是形容词命名

    2.3 接口的使用

    implement 关键字

    • 接口不能直接使用,需要搭配一个类来实现接口中的所有抽象方法
    1. public  class 类名称 implements 接口名称{
    2.   // ...
    3. }

    2.4 接口的特性

    • 1. 接口类型是一种引用类型,但是不能直接 new 对象。
    • 2. 接口中的方法都是 public abstract 修饰的 -- 默认的,所以为了简洁不需要添加。
    • 3. 接口中的方法是不能直接在接口中实现的,只能由实现接口类中来实现。
    • 4. 在类中,重写接口方法的时候,不能使用默认的访问权限 -- 因为默认的权限 < public
    • 5. 接口中,可以含有变量,默认被 public static final 修饰
    • 6. 接口中,不能由静态代码块和构造代码块
    • 7. 接口虽然不是类,但是接口编译完成后的字节码文件的后缀也是 .class
    • 8. 如果类没有实现接口中所有的抽象方法,则类必须设置为抽象类
    • 9. jdk8 中,接口还可以包含 default 方法

    2.5 实现多个接口

    • Java不能多继承,所以接口的存在就是为了满足多继承的场景的 -- 即一个类可以实现多个接口。
    • 继承表示的是 is - a的语义,而接口表示的具有什么特性

    2.6 接口间的继承

    • 用接口可以达到多继承的目的。
    • 同样是 extends 关键字

    2.7 接口的使用示例

    对象数组排序 -- 需要我们实现如何排序的方法

    • 在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.
    • 注意事项: 对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo 方法的方式, 就可以定义比较规则.

    模拟实现使用接口的冒泡排序

    2.8 Clonable 接口和深拷贝

    • Java 中内置了一些很有用的接口, Clonable 就是其中之一.
    • Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.

    实现深拷贝 -- 每个引用类型都需要实现clone 且都需要进行赋值 -- 也就是说,成员变量有几个引用类型,就需要调用几次clone方法

    2.9 抽象类和接口的区别

    • 相同点
      • 都是Java中实现的多态的方式
    • 区别
      • 1. 抽象类中可以包含普通方法和普通字段 -- 这些方法和字段可以直接被子类直接使用而不需要被重写;而接口中不能包含普通方法,子类必须重写接口中所有抽象方法。
      • 2. 结构组成:抽象类中有普通方法+抽象方法;接口(抽象方法 + 全局变量)
      • 3. 权限:抽象类中可以有各种各样的权限;接口中只能是public
      • 4. 子类使用:子类通过extends来继承抽象类,通过interface来实现接口。
      • 5. 关系:一个抽象可以实现若干个接口;接口不能继承抽象类,但接口可以使用extends关键字来继承多个父接口

    3. Object 类

    • Object 是Java默认提供的一个类。
    • Java中除了 Object类,所有的类都是存在继承关系的 -- 默认都会继承Object父类。
    • 即所有类的对象都可以用 Object 类来接受。
    1. class Person{}
    2. class Student{}
    3. public class Test {
    4. public static void main(String[] args) {
    5. function(new Person());
    6. function(new Student());
    7. }
    8. public static void function(Object obj) {
    9. System.out.println(obj);
    10. }
    11. }
    12. //执行结果:
    13. Person@1b6d3586
    14. Student@4554617c

    Object 类中方法

    Object 中的方法都需要全部进行掌握

    toString 方法  -- 获取对象信息

    1. // Object类中的toString()方法实现:
    2. public String toString() {
    3.   return getClass().getName() + "@" + Integer.toHexString(hashCode());
    4. }

    equals方法 -- 对象比较

    Java中 == 比较:

    • 如果==左右两侧是基本类型变量,比较的是变量中值是否相同
    • 如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
    • 如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
    1. // Object类中的equals方法
    2. public boolean equals(Object obj) {
    3.   return (this == obj);  // 使用引用中的地址直接来进行比较
    4. }

    结论:比较对象中内容是否相同的时候,一定要重写equals方法。

    hashcode方法 -- 算了一个具体的对象位置

    • hashcode方法用来确定对象在内存中存储的位置是否相同
    • 事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

  • 相关阅读:
    并发编程-Java内存模型
    深度学习——GRU单元
    七点工具箱(安卓)
    java计算机毕业设计企业公开招聘系统源码+数据库+lw文档+系统
    混币器困境:保护了隐私也掩护了黑产
    idea傻瓜式快速搭建springboot框架
    Python学习
    数组合并和对象合并的方法
    DOM节点
    说说原型(prototype)、原型链
  • 原文地址:https://blog.csdn.net/zxj20041003/article/details/133236982