Java查漏补缺5
- 抽象类可以有静态方法
- 静态与抽象不能共存于方法上
- 抽象静态方法无意义(不存在)
- 抽象类中访问权限
- 接口与抽象类的区别
- 缺省适配模式
抽象类可以有静态方法
静态方法是依赖于类而存在的,静态方法只要有字节码存在就可以运行。
静态与抽象不能共存于方法上
静态属于字节码,不需要对象就可以运行,而抽象方法没有方法体,运行没有意义,二者不能共存。
抽象静态方法无意义(不存在)
抽象类中可以定义静态方法(但抽象类不能实例化),定义的这个静态方法实际上是帮自己的子类(实现类)定义的。
抽象类中没有抽象静态方法,因为抽象静态方法不存在。
抽象类中访问权限
抽象类中方法为abstract时只有public,protected,default三种访问权限。
接口中所有方法的访问属性为public, 即接口中的方法自动默认为 public,所以实现接口中的方法必须标识为public 或者 abstract,否则编译出错。
在JAVA 8 或者更高的版本中的可以使用default
接口中抽象类常量(public static final)抽象方法(public abstract)
接口与抽象类的区别
- Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以。(就是interface中只能定义方法,而不能有方法的实现,而在abstract class中则可以既有方法的具体实现,又有没有具体实现的抽象方法)。
如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个 新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行。 - 一个抽象类的实现只能由这个抽象类的子类给出,Java的单继承性导致抽象类作为类型定义工具的效能大打折扣。
任何一个实现了一个接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个接口,从而这个类就有了多种类型。
使用抽象类,那么继承这个抽象类的子类类型就比较单一,因为子类只能单继承抽象类;而子类能够同时实现多个接口,因为类型就比较多。接口和抽象类都可以定义对象,但是只能用他们的具体实现类来进行实例化。
缺省适配模式
A extends AbstractB implements interfaceC
A既可以选择实现implement接口interfaceC中的方法,也可以选择不实现;A既可以选择重写Override抽象类AbstractB中的方法,也可以选择不重写。