用java抽象类的jar误导行为

时间:2012-07-05 05:28:15

标签: java

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

这是项目enter image description here

的最终目录结构

请帮我清除概念

2 个答案:

答案 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它需要提供抽象方法的实现