面试 | 接口和抽象类的区别

旁白:这个面试题经常被问到,我这里从四个方面来总结。虽然面试的时候可能没有那么的时间全部说完,但我觉得概念设计目的应该要说清楚;因为从这两点就能看出你对两者的理解深度。

1.概念的不同

接口:是对行为的抽象,是抽象方法的集合。实现接口的类必须遵循契约模式,也就是必须实现
接口中的方法。
抽象类:是用于抽取子类通用特性的。是被用来创建继承层级里子类的模板,因此它不能被实
例化,只能作为父类被子类继承。

2.使用原则

接口使用最典型的例子是策路模式,不同场景下使用不同的策略,对行为的抽象。
抽象类使用最典型的例子是模板模式,是抽取不同类的通用代码构成父类,一是方便子类复用,二是子类可以重写父类实现自己的逻辑。

3.各有特点

接口特点

  • 接口本身没有构造函数,因此不能实例化;
  • 类可以实现多个接口,抽象类也可以,接口本身也可以继承其他接口;
  • 接口内部方法默认为 public访问级别,不能用fina关键字修饰方法;
  • 接口中只能包含抽象方法,默认省略 public abstract修饰字,不能包含其他任何已经实现的方法;但idk1.8后,接口中可以包static方法和 default方法。【这里可以思考下为什么要这么设计?】
  • 接口中的成员变量都是 public static finals类型的;对于基本类型,实现类中则不能改变值,对于引用对象,实现类则指向同一个对象,但对象中的内容可以改变。【这里可以思考下为什么要设计成静态不可変类型的成员变量?】
public interface eat{
	void food();  // 前面省掉了默认的 public abstract
	abstract void foodType();  // 默认省掉public
}

抽象类特点

  • 抽象类可以有构造函数,但本身不能实例化;定义为抽象类;
  • 含有抽象方法的类一定是抽象类,但抽象类中不ー定含有抽象方法;
  • 抽象方法需要用abstracte关键字来修饰,且不能用 private关键字来修饰,因为抽象方法需要被子类重写;
public abstract class Ainmal{
    abstract void run();  // 默认default修饰符  除了private 其他修饰符都可以
    public void breath(String organ){   // 实例方法
        System.out.println("用" + organ + "呼吸...");
    }
}
4.设计目的不同

抽象类是对事物的抽象,即对类的抽象;而接口是对行为的抽象。抽象类是对整个类进行抽象,包括属性和行为,但是接口只是对行为(方法)进行抽象。举个例子:飞机和鸟都会飞,但飞机和鸟是不同的事物,分别抽象为 Airplane类和Bird类;会飞是一种纯粹的行为或者方法,不可能把飞抽象成一个类,因此可以把会飞声明为一个接口Flyinterface, Airplane类和Bird类根据情况实现接口中会飞的方法。然后对于不同种类的飞机,如战斗机,民用机,无人机等继承 Airplane类,不同种类的鸟,如喜鹊,乌鸦,燕子等继承Bird类。所以,继承是一个“是不是”的关系,而接口实现是一个“有没有”的关系。无人机是不是飞机,乌鸦是不是鸟,“是”则是继承,飞机有没有飞这个能力,鸟有没有飞这个能力,“有”则是实现。

PS:如果想了解到更多关于Java、C、CPP等语言方面的特性知识;分布式开发zk的使用;mysql数据库的特性等;欢迎关注我们的公众号。
公众号
PS:内容丰富全面,共同进度!欢迎你的关注!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值