0

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

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

请帮我理清概念

4

2 回答 2

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

这应该有效。

于 2012-07-05T05:31:19.473 回答
2

如果您未指定默认指定的访问权限,则可见性是default 这意味着该字段将可以从该类所属的同一包内访问。

所以现在你的deep()from实现bb在 cc 中不可见,因为它来自不同的包

并且由于cc没有接收到的实现deep()并且它间接扩展aa了它需要提供抽象方法的实现

于 2012-07-05T05:32:00.940 回答