用java抽象类的jar误导行为

Dee*_*oel 0 java

我遇到了一个非常奇怪的行为,我在一个包中创建了两个类aa.bb

类aa的代码

         package aa.bb;
         public abstract class aa {
        abstract void deep();
          }
Run Code Online (Sandbox Code Playgroud)

bb类代码

       public class bb extends aa{
            @Override
        void deep() {
        }
            }
Run Code Online (Sandbox Code Playgroud)

现在我创建了另一个包,说bbc.cc,并在这个包中创建了一个类.

cc级代码

          package bbc.cc;
           import aa.bb.bb;
           public class cc extends bb {
            }
Run Code Online (Sandbox Code Playgroud)

现在cc类显示错误此类必须实现继承的抽象方法aa.deep(),但不能覆盖它,因为它在cc中不可见.使类型抽象或使继承的方法可见

现在创建一个包aa.bb的jar文件,并从源代码中删除aa.bb包.并在构建路径中添加了jar文件.在此之后,错误将如前所述.现在我在aa.bb包中添加了bb类的源代码并解决了错误.我不知道这背后发生了什么.

这是项目的最终目录结构在此输入图像描述

请帮我清除这个概念

Gar*_*age 5

发生这种情况是因为default任何方法或类的访问权限都是package level.

因此,该方法void deep()实际上对于同一包内的类是可见的aa.bb

我建议你deep()公开你的方法.

package aa.bb;
public abstract class aa {
   public abstract void deep();
}
Run Code Online (Sandbox Code Playgroud)

public class bb extends aa{
    @Override
    public void deep() {
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该工作.