Class ‘XXX‘ must either be declared abstract or implement abstract method ‘xxx‘

最近引入外部jar包,继承抽象类时出现这个问题,Class ‘XXX’ must either be declared abstract or implement abstract method ‘xxx’,这里IDEA给提示了,该类需要被申明为抽象的,或者实现父类的 ‘xxx’ 方法(抽象方法)。
Class ‘XXX‘ must either be declared abstract or implement abstract method ‘xxx‘_第1张图片

问题:

这里我们不想申明该子类为抽象类,也实现了父类的抽象方法,可还是有这个问题。

解决办法:

后来发现是作用域的问题,父类的抽象方法没有显示表明为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、抽象类

你可能感兴趣的:(Java,Debug)