• Java之接口和抽象类详解


    抽象类

    背景

    之所以引入抽象类和抽象方法,是为了引导使用者正确使用它们,减少被误用。当抽象类中的方法被声明为抽象方法时,继承它的子类就知道需要实现该方法。

    只可单继承的设计原因

    Java中类不能多继承类是为了安全。因为无论是抽象类还是非抽象类都包含非抽象的方法(非抽象类也可能没有),当类可以多继承类时,被继承的不同的父类可能会有同名同参的方法,如果子类也没有重写这个同名同参的方法,则在子类的实例调用这个方法的时候就会出现冲突。

    特点

    • 抽象类和抽象方法使用abstract 关键字声明
    • 抽象类不能被实例化。
    • 有抽象方法的类,一定是抽象类,但是抽象类可以没有抽象方法。
    • 当一个类继承的父类是抽象类的话,需要我们把抽象类中的所有抽象方法全部实现,除非此类也是一个抽象类。
    • 抽象方法不能有方法体。就是不给出方法的具体实现也就是方法的具体功能。
    • 抽象类只能被继承,只能单继承

    举例

    简单实例,Employee是一个抽象类,其中有comptePay()为抽象方法,再
    Salary继承抽象类,

    public abstract class Employee {
        private String name;
        private String address;
        private int number;
    
        public abstract double computePay();
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    public class Salary extends Employee
    {
        private double salary; // Annual salary
    
        public double computePay()
        {
            System.out.println("Computing salary pay for " + getName());
            return salary/52;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试及输出
    在这里插入图片描述

    可以看到,抽象类不能实例化本类对象,只能通过继承它的子类声明子类对象。

    接口

    背景

    前面我们介绍了抽象类,可以看到抽象类只支持单继承,而面对子类是由多个类的部分组合的情况下, 及比如食品类,饮品类,而套餐类里既有食品类下的具体食品又包含饮品类下的具体饮品。简单的说就是类似于多继承关系的实现,所以为了解决这种情况,提出了更加抽象的接口。

    特点

    • 接口用interface声明
    • 类实现接口用implements [接口类名1],[接口类名2]
    • 接口中所有的方法默认都是public abstract(不写访问权限修饰符就是默认public abstract)
    • 接口中所有的变量都是public static final修饰的(该变量属于类还是常量,必须初始化)
    • 接口在JDK8 之后可以通过default声明方法体
    • 类实现接口时必须实现所有接口方法,除非是抽象类但也要声明空的接口方法

    举例

    常见的,比如我们在使用Spring框架体系时,往往服务层是由接口和实现类实现的,通常有一个接口(server),再有一个业务类实现接口的具体方法(serverImpl)。

    public interface InterDemo {
        static final int sta = 10;
        double getARandom();
        void showThing();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    
    public class ImplDemo implements InterDemo{
    
        @Override
        public double getARandom() {
    
            return Math.random();
        }
    
        @Override
        public void showThing() {
            System.out.println(sta + "这是接口中定义的常量");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    public class Main {
        public static void main(String[] args) {
            ImplDemo demo = new ImplDemo();
            System.out.println(demo.getARandom());
            demo.showThing();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    接口与抽象类的对比

    1. 抽象类用abstract声明,并用extends继承,而接口用interface声明,implements实现
    2. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
    3. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
    4. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
    5. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
    6. 抽象类虽然抽象但依旧是类,对于类的操作都能使用,但接口虽然写在.java文件,但其并不是类,所以更像一个抽象方法的集合。

    注意:

    1. JDK 1.8 以后,接口里可以有静态方法和方法体了
    2. JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。
  • 相关阅读:
    postgresSQL多种字符串分割及查询汇总
    如何使用 Docker 部署 GitLab
    Linux基本指令(二)
    js实现字符串转json对象的四种方法
    wy的leetcode刷题记录_Day46
    STL浅析
    Python:操作SQLite数据库简单示例
    华为任正非:活下来!
    uniapp 原生sqlite本地数据库管理 Ba-Sqlite
    适合自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》
  • 原文地址:https://blog.csdn.net/qq_45515347/article/details/126771190