抽象类与接口

1 抽象类和抽象方法

abstract关键字允许在类中创建一个或多个没有任何定义的方法即只声明了方法却没有提供方法体如abstract void f(),这些实现是由此类的继承者创建的。
包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象的。我们也可以定义一个没有任何抽象方法的抽象类。某个类称为抽象类,不需要所有的方法都是抽象的。

切记:不允许创建抽象类的对象。


2 接口

在接口中的每一个方法都只是一个声明,这是编译器所允许的在接口中唯一能够存在的事务,此外,在接口中没有任何方法被声明是public的,但是它们自动都是public abstract的,而且接口中的方法只能被这两个关键字修饰,在使用的时候加不加关键字都自动是public abstract的。接口也可以包含域,但是这些域隐式地是public 、static和final的。
接口中定义的域不可以是“空final”的,但是可以被非常量表达式初始化。如

Public interface test{
    Random rand = new Random(47);
    int RANDOM_INT = rand.nextInt(10);
}

使用接口的原因:①为了能够向上转型为多个基类型,以及由此带来的灵活性;
②防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。

3 为什么java中有些接口没有任何方法

  在java语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口。标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。


4 抽象类与接口的相同点

1) 都不能被实例化;

2) 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才可以被实例化。


5 抽象类与接口的不同点

从写一个类的过程来看。

1)接口可以继承接口,抽象类既可以实现接口也可以继承具体类;

2) 接口中的成员变量是public static final,所以必须给其赋初值,所有的成员方法都是public 、static的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有抽象的成员方法,抽象类中的成员变量和普通类的成员变量一样的四种修饰符,抽象类的抽象方法由于要被继承的子类实现,因此不能被private、static、synchronized、native等访问修饰符修饰,同时必须以分号结尾,并且不能带有花括号。所以,当功能需要被积累时用抽象类;不需要积累时用接口。
3)接口中的方法只有定义不能实现,而抽象类中的方法可以有定义与实现;
4)接口不可以有静态的public static void main(String[] args){}方法,抽象类可以有。
5)接口是被实现,而抽象类只能被继承。一个类可以实现多个接口,但是只可以继承一个抽象类,因此使用接口可以间接地达到多重继承的目的;
6)接口强调的特定功能的实现,其设计理念是“has-a”的关系,而抽象类强调所属关系,是“is-a”的关系;
7)接口被用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。
总之,接口是一种特殊形式抽象类,使用接口完全由可能实现与抽象类相同的操作,但一般而言,抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在逻辑上的层次结构时,推荐使用抽象类;而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或者更多对象之间的特定交互行为时,应该使用接口。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值