我遇到了一个非常奇怪的行为,我在一个包中创建了2个类,如aa.bb
类aa的代码
package aa.bb;
public abstract class aa {
abstract void deep();
}
班级代码bb
public class bb extends aa{
@Override
void deep() {
}
}
现在我创建了另一个包,说bbc.cc并在这个包中创建了一个类。
cc类代码
package bbc.cc;
import aa.bb.bb;
public class cc extends bb {
}
现在cc类显示错误此类必须实现继承的抽象方法aa.deep(),但不能覆盖它,因为它在cc中不可见。将类型设为摘要或使继承的方法可见
现在创建包aa.bb的jar文件并从源代码中删除aa.bb包。并在构建路径中添加了jar文件。在此之后,错误将如前所述。现在我在aa.bb包中添加了bb类的源代码并解决了错误。 我不知道背后发生了什么。
这是项目
的最终目录结构请帮我清除概念
答案 0 :(得分:5)
这是因为任何方法或类的default
访问权限为package level
。
因此,方法void deep()
实际上对同一个包aa.bb
我建议您将方法deep()
公开。
package aa.bb;
public abstract class aa {
public abstract void deep();
}
和
public class bb extends aa{
@Override
public void deep() {
}
}
这应该有用。
答案 1 :(得分:2)
如果您未指定默认指定的访问权限,则可见性为default
,这意味着该字段可从该类所属的同一个包内访问。
所以现在您在deep()
中bb
的实施在cc中不可见,因为它来自不同的包
并且由于cc
没有接收deep()
的实现,并且间接扩展aa
它需要提供抽象方法的实现