【面试题】抽象类和接口的区别?

文章目录

抽象类

什么是抽象类,为什么要使用抽象类?

  1. 抽象类作为派生其他类的基类,而不做为特定的一种实例类。具体的实现要在子类中完成。
  2. 如果定义了抽象类,在查看代码时,就会注意抽象方法,而知道这个方法是在子类中实现的,起到提示作用。
//使用abstract关键字来定义接口
public abstract class Person {
    protected Person() {

    }
    //定义了一个抽象类
    //只要类中存在抽象方法,那么这个类就要定义成抽象的。
    public abstract void getName();
    //抽象类中可以实现非抽象方法
    public void printN(){
        System.out.println("123");
    }

}
public class Demo extends Person {
    public static void main(String[] args) {
        //以下两种方式来创建对象都可以。

        //方式一:父类引用指向子类对象。
        Person p=new Demo();
        Demo d=new Demo();
        p.printN();
        p.getName();
        d.printN();
    }
    //子类必须实现抽象类中的抽象方法。
    public void getName(){
        System.out.println("Sivan Xin");
    }
}

接口

  • 什么是接口,为什么要使用接口?
  1. 接口体现的是一种规范。可以认为和类是并列的关系。
    如果拿继承来类比,继承更多表示“是不是”问题,而接口更多表示“能不能”的问题。

  2. 从某种程度上来看,接口类似于整个系统的“总纲”,它制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变。一旦接口被改变,对整个系统甚至其他系统的影响将是辐射式的,会导致系统中大部分类都需要改写。

//implements关键字表示该类调用了这个接口
public class Demo implements Person {
    public static void main(String[] args) {
        Demo d=new Demo();
        d.run();
        d.walk();
        d.go();
        //接口静态方法只能这样调用
        Person.go1();
    }
	//如果一个类调用了接口,就必须实现接口中的所有声明的方法。
    @Override
    public void walk() {
        System.out.println("walk");
    }

    @Override
    public void run() {
        System.out.println("run");
    }
}
//使用interface关键字来定义接口
interface Person{
    //1.8之前接口中不允许实例化方法。
    void walk();
    //在接口中使用abstract是多余的。
    abstract void run();
    //在jdk1.8之后,允许使用default(默认)方法和静态方法。
    default void go(){
        System.out.println("go");
    }
    static void go1(){
        System.out.println("go1");
    }
}

区别

  • 侧重点:接口强调特定功能的实现,而抽象类强调所属关系。
  • 多重继承:一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
  • 构造器:接口不能存在构造器,抽象类存在构造器。
  • 添加方法:对接口进行修改,就要改变所有调用接口的类。对抽象类进行修改,可以给他提供默认的实现,不必重新修改子类。
  • 访问修饰符:接口在jdk1.7及之前,只能使用public,1.8及之后可以定义default和static方法。而abstract类可以使用多种访问修饰符。
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sivan_Xin

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值