admin管理员组

文章数量:1636810

最近引入外部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的区别
区别抽象类接口
关键字abstractinterface
成员变量对成员变量没有特别要求和限制只能包含公共静态变量(默认由public static final修饰)
方法可包含任意方法只能包含且抽象的方法(默认由public abstract修饰)
使用一个类只能继承一个抽象类一个类可以实现多个接口

参考:
1、入坑Java(八)abstract & implements
2、Java中的作用域有哪些
3、抽象类

本文标签: declaredxxxclassabstract