最近引入外部jar包,继承抽象类时出现这个问题,Class ‘XXX’ must either be declared abstract or implement abstract method ‘xxx’,这里IDEA给提示了,该类需要被申明为抽象的,或者实现父类的 ‘xxx’ 方法(抽象方法)。
问题:
这里我们不想申明该子类为抽象类,也实现了父类的抽象方法
,可还是有这个问题。
解决办法:
后来发现是作用域
的问题,父类的抽象方法没有显示表明为public
,而是默认default
,又因为该父类方法是外部包
的抽象类,导致不能继承其默认的抽象方法
。
总结:
继承外部抽象类时要注意,父类的抽象方法一定要带上public
关键字,避免打包后别人使用异常。
附:回顾抽象类和作用域相关知识
抽象类
- 所有抽象类必须有子类(abstract与final 不能同时出现,若同时出现则在编译时报错)被final修饰的类不能有子类(终结器);
- 当抽象类的子类不是抽象类时,抽象类的子类必须覆写抽象类的所有抽象方法;
- 抽象类可以使用子类向上转型为其实例化,抽象类一定不能直接实例化对象(无论是否有抽象方法);
- 由于抽象类强制要求子类覆写抽象方法,因此abstract与private 不能一起使用。
作用域
作用域与可见性 | 当前类 | 同一package | 子类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
protected & default
- protected:表名成员变量或方法对该类自身,与它在
同一个包中
的其他类,在其他包中的该类的子类都可见 - defaul:表明该成员变量或方法只有自己和与其位于
同一包内
的类可见。
若父类与子类处于同一包内,则子类对父类的default成员变量或方法都有访问权限;若父类与子类处于不同的package内,则没有访问权限
。 - private和protected不能用来修饰类
abstract 与 implements的区别
区别 | 抽象类 | 接口 |
---|---|---|
关键字 | abstract | interface |
成员变量 | 对成员变量没有特别要求和限制 | 只能包含公共静态变量(默认由public static final 修饰) |
方法 | 可包含任意方法 | 只能包含且抽象的方法(默认由public abstract 修饰) |
使用 | 一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
参考:
1、入坑Java(八)abstract & implements
2、Java中的作用域有哪些
3、抽象类