java抽象类中jar的误导行为
我遇到了一个非常奇怪的行为,我在一个包中创建了两个类,比如aa.bb aa类代码java抽象类中jar的误导行为,java,Java,我遇到了一个非常奇怪的行为,我在一个包中创建了两个类,比如aa.bb aa类代码 package aa.bb; public abstract class aa { abstract void deep(); } bb类代码 public class bb extends aa{ @Override void deep() { }
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类的源代码,并解决了错误。
我不知道这背后发生了什么
这是项目的最终目录结构
请帮助我澄清概念发生这种情况是因为任何方法或类的
默认访问权限都是包级别
因此,方法void deep()
对于同一个包aa.bb
我建议将您的方法deep()
公开
package aa.bb;
public abstract class aa {
public abstract void deep();
}
及
这应该是可行的。如果未指定默认指定的访问权限,则可见性为default
,这意味着可以从类所属的同一包中访问该字段
因此,现在您的deep()
来自bb
的实现在cc中不可见,因为它来自不同的包
因为
cc;t接收deep()
的实现,它间接扩展了aa
它需要提供抽象方法的实现感谢您的回答。但我还添加了另一个场景,当我在构建路径中将包aa.bb添加为jar文件时,我还从aa.bb文件夹中删除了仅aa类的源代码。然后它没有显示任何错误。当我添加了一个包时,包没有得到它。对不起。我用aa.bb包创建了另一个项目,并创建了一个jar。现在,将该jar添加到此项目的构建路径中。现在错误是一样的。现在我只在包aa.bb中添加了类bb,现在没有编译时错误。因为一旦你把它们作为父类放在同一个包中,方法(抽象)的实现就会发生通过继承在类中可用,因此您不需要将抽象方法的实现放在不同的包中。不,不,我添加了bb类,而不是cc类。谢谢您的回答。是的,我知道通过公开它会起作用。但我还添加了另一个场景,当我在构建路径中将包aa.bb添加为jar文件时,我还从aa.bb文件夹中删除了仅aa类的源代码。那么它没有显示任何错误。
public class bb extends aa{
@Override
public void deep() {
}
}