java抽象类中jar的误导行为

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() { }

我遇到了一个非常奇怪的行为,我在一个包中创建了两个类,比如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类的源代码,并解决了错误。 我不知道这背后发生了什么

这是项目的最终目录结构


请帮助我澄清概念

发生这种情况是因为任何方法或类的
默认访问权限都是
包级别

因此,方法
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() {
    }
}