面试:一文搞懂抽象类和接口的区别

一、什么是接口?

接口通常以interface来声明,如下图代码所示:(用户信息接口声明语法格式)
在这里插入图片描述

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念,接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合。类描述对象的属性和方法。接口则包含类要实现的方法。

那么我们就来完整的写一个接口:(用户信息接口)

public interface UserService {
    // 声明变量
    final Integer NUMBER_ONE = 1;
    // 抽象方法
    public Integer num(Integer NUMBER_ONE, Integer a, Integer b);
}

声明接口特点:

Java 接口中声明的变量默认都是 final 的,Java 接口中的成员函数默认是 public 的。

接口实现类怎么写呢?

类如果要实现一个接口,它必须要实现接口声明的所有方法。

public class UserServiceImpl implements UserService {

    @Override
    public Integer num(Integer NUMBER_ONE, Integer a, Integer b) {
        return NUMBER_ONE + a + b;
    }

    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        Integer num = userService.num(NUMBER_ONE,1,2);
        System.out.println(num);
    }
}

类只能实现一个接口?

显然不是,类可以实现很多个接口,比如我们再编写一个订单接口,用于验证:

public interface OrderService {

    // 声明变量
    final Integer NUMBER_ONE = 1;
    // 抽象方法
    public Integer subtraction(Integer NUMBER_ONE, Integer a, Integer b);
}

注意:实现类必须要实现接口声明的所有方法
在这里插入图片描述
接口可以被实例化吗?

显然不可以,因为它并不是一个类,只是一个接口。

二、什么是抽象类?

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

员工抽象类:

public abstract class Employee {

    private String name;
    private String address;
    private int number;

    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;
    }

    // 无参构造
    public Employee() {
    }

    // 有参构造
    public Employee(String name, String address, int number) {
        this.name = name;
        this.address = address;
        this.number = number;
    }
    
     // 抽象的方法
    public abstract Integer num(Integer a, Integer b);
    
    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", number=" + number +
                '}';
    }
}

抽象类可以包含非 final 的变量、抽象类的成员函数可以是 private,protecte或者是 public 。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

既然不能实例化它,我们怎么获取它的成员变量,以及方法呢?

new一个类继承抽象类,通过该方法可以设置或获取抽象类成员变量,以及成员方法。

public class Salary extends Employee
public class Salary extends Employee{

    private double salary;

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Salary() {
    }

    @Override
    public Integer num(Integer a, Integer b) {
        return a+b;
    }

    // 该对象将从 Employee 类继承 其他成员方法
    // 通过该方法可以设置或获取三个成员变量。
    public Salary(String name, String address, int number, double salary) {
        super(name, address, number);
        this.salary = salary;
    }
    

    public static void main(String [] args)
    {
        Salary s = new Salary();
        Employee e = new Salary("ac", "上海", 2, 2400.00);
        System.out.println(s.num(1,2));
        System.out.println(e);
    }
}

类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象方法指一些只有方法声明,而没有具体方法体的方法。抽象方法一般存在于抽象类或接口中。

在这里插入图片描述

三、区别

1、接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
比如你只能在接口这样写方法:
在这里插入图片描述
比如你只能在抽象类中写方法:
在这里插入图片描述

2、类可以实现很多个接口,但是只能继承一个抽象类。
在这里插入图片描述
3、类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现
抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
在这里插入图片描述
4、抽象类可以在不提供接口方法实现的情况下实现接口。
在这里插入图片描述
在这里插入图片描述
该Salary对象类 继承了 Employee 类 然后 抽象类Employee 实现 UserService接口 所以可以重写UserService接口中的方法

@Override
public Integer num(Integer NUMBER_ONE, Integer a, Integer b) {
    return null;
}

5、Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
6、Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protecte
或者是 public 。
在这里插入图片描述
在这里插入图片描述
7、接口是绝对抽象的,不可以被实例化(java 8 已支持在接口中实现默认的方法)。抽象类
也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。

最后

如果你觉得DT_小白文章写的还不错,请微信搜索并关注「 Java云社 」微信公众号,和DT_小白一起学习Java、分布式、微服务、大数据技术,并且「 Java云社 」收集了大量的大厂面试题目集,等你来挖掘,为了提升自己的能力,实现技术能力的飞跃,每天定时更新超硬核技术干货,我在「 Java云社 」等您的加入,让我们共同学习吧!

在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DT辰白

你的鼓励是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值