Java抽象类和接口
Posted lybb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java抽象类和接口相关的知识,希望对你有一定的参考价值。
interface是比抽象类更高层次的抽象,接口中的所有方法都是抽象方法,不会有任何实现方面的代码。
1. interface的方法只能是public abstract的。( Public abstract可以省略,也可以只写一部分,比如public void f() ) , 不能是private、protected等类型的。
2. interface的属性只能是public static final的。
- 为什么必须是public呢?因为接口必须有实现才有意义,所以接口的变量和方法必须是public的。
- 为什么必须是static的? static修饰是表示它属于类的,随的类的加载而存在的,如果是非static的话,就表示属于对象的,只有建立对象时才有它,而接口是不能建立对象的,
- 为什么必须是final的? 如果变量不是final,那么每个实现接口的类就可以更改这个变量的值,也就违反了OCP原则(OCP原则:对扩展是开放的,对更改是封闭的)。
3. 为什么抽象类不能多继承?
假如A中有方法f(),B和C继承了A,D继承了B和C,那A a = new D(); a.f()会调用B的方法还是C的方法呢?这就是致命方块问题。
4. 接口为什么不存在致命方块问题?
假如接口A中有方法f(),接口B和接口C继承了A,D继承了B和C,那A a = new D(); a.f()会调用D的方法,因为B和C都是抽象方法。
5. 接口和抽象类的相同点。
- 都不能初始化
- 都能实现多态
6. 接口和抽象类的不同点。
- 接口的方法都是public abstract的,成员变量都是public static final的,抽象类则随意。
- 接口like-a,抽象类is-a
- 接口多继承
- 接口比抽象类更抽象
- 抽象类有构造方法
- 抽象类可以有实现了的方法。
5. 接口和抽象类的应用场景。
- 当关注点在事物的本质的时候,用抽象类。当关注操作的时候,用接口。
- is-a和like-a
- 抽象类的功能要远超过接口,但是,因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类, 所以定义抽象类的代价高。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。接口也更适合复用。
- 由于接口更关注于动作的实现,多态主要是分离“做什么”和“怎么做”,所以接口的另一个重要的应用就是多态的实现(当然抽象类也可以实现多态,但是接口更加合适)。为什么说接口更合适实现多态?因为抽象类的父子之间都有实现,不像接口中是"做什么",实现类中是"怎么做",一目了然。
以上是关于Java抽象类和接口的主要内容,如果未能解决你的问题,请参考以下文章