声明
导航
- 抽象类(abstract class)和接口(interface)有什么异同?
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
抽象类:体现的是is-a的关系,如对于man is a person,就可以将person定义为抽象类。
接口:体现的是can的关系。是作为模板实现的。如设置接口fly,plane类和bird类均可实现该接口。
一个类只能继承一个抽象类,但可以实现多个接口。
- 接口和抽象类的相同点和区别?
相同点:
(1)都不能被实例化。
(2)接口的实现类或抽象类的子类需实现接口或抽象类中相应的方法才能被实例化。
不同点:
(1)接口只能有方法定义,不能有方法的实现,而抽象类可以有方法的定义与实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,只能继承一个抽象类。
(3)当子类和父类之间存在逻辑上的层次结构,推荐使用抽象类,有利于功能的累积。当功能不需要,希望支持差别较大的两个或更多对象间的特定交互行为,推荐使用接口。使用接口能降低软件系统的耦合度,便于日后维护或添加删除方法。
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
- 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
- 已经有抽象类了为什么还要设计接口?
因为Java规定一个类只能有一个父类也就是单继承,但是一个类可以实现多个接口,从而达到“多继承”的效果。
- 如果一个类同时实现的两个接口包含同样方法名和参数的方法如何解决?
如果一个类实现的两个接口中包含了一个同样方法名和参数的方法,会在编译阶段给出错误提示,让使用者重写该解决接口方法名冲突二样性。
- 如果一个类继承的一个抽象类和接口中包含了相同方法名和参数的方法如何解决?
在这种情况下,会遵循“类优先”规则,使用超类中的方法,接口中的默认方法会被忽略。
- 接口能被继承吗?抽象类能否实现接口?
接口只能被接口继承,从而添加新的接口方法。抽象类可以实现接口,但是需要重写接口中的方法(接口比抽象类更加抽象)。
- 什么是标记接口?你知道的标记接口有哪些?
标记接口一般用于说明类应该包含某种行为。如Serializable可序列化接口。
- jdk代理为什么只能代理接口?
jdk代理的原理是通过反射机制继承Proxy类的同时实现接口,而JDK生成的代理对象是必须继承proxy的,Java只存在单继承,所有jdk代理只能代理接口。
- 为什么cglib可以代理对象?
cglib代理的原因是生成被代理对象的子类从而实现代理,被代理对象的子类可以继承被代理对象,从而cglib可以代理对象。
- jdk代理和cglib代理有何异同?
相同点: 都是在程序运行时动态的创建,被创建完成后与普通类没有却别
不同点: jdk代理只能代理接口,cglib可以代理接口和类。