抽象类和接口

抽象类与接口

1、抽象类

抽象类和抽象方法都使用 abstract 关键字进行声明。
抽象类一般会包含抽象方法(也可以不包含,但是有抽像方法的类一定是抽象类),抽象方法一定位于抽象类中。
抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。

2、接口

接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。从 Java 8 开始,接口也可以拥有默认的方法实现,使用default关键字修饰的接口方法可以有默认实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。接口的字段默认都是 static 和 final 的。
在这里插入图片描述

3、比较

1、接口的方法默认是 public,在接口中所有方法不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法;
2、接口中的实例变量默认是 final 类型的,而抽象类中则不一定;接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name
3、一个类可以实现多个接口,但最多只能实现一个抽象类;
4、一个类实现接口的话要实现接口的所有方法,而抽象类不一定;
5、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。
6、从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范;
7、抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

4、使用选择

使用接口

  • 需要让不相关的类都实现一个方法
  • 需要使用多重继承
    使用抽象类
  • 需要在几个相关的类中共享代码
  • 需要能控制继承来的成员的访问权限,而不是都为了public
  • 需要继承非静态和非常量字段

在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值