2012-07-05 46 views
0

误导行为,我面对的是我在一个包中创建2级的一个非常奇怪的行为,说AA级的aa.bb用罐子中的Java抽象类

代码

  package aa.bb; 
     public abstract class aa { 
     abstract void deep(); 
      } 

准则类BB

 public class bb extends aa{ 
      @Override 
     void deep() { 
     } 
      } 

现在我创造了另一个包说bbc.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

请帮我清除

回答

4

发生这种情况,因为任何方法或类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() { 
    } 
} 

这应该工作。

+0

感谢您的回答。是的,我知道通过公开它会工作。但我还添加了另一个场景,当我添加包aa.bb作为构建路径中的jar文件,并从aa.bb文件夹中删除了aa类的源代码。然后它不显示任何错误。 –

2

如果您未指定缺省指定的访问权限,则可见性为default,这意味着该字段将可从该类所属的相同包中访问。

所以,现在,因为它是从不同的包

,自cc没有按你从bbdeep()执行不CC可见收不到的deep()的实现,它间接地扩展aa它需要提供执行情况抽象方法

+0

感谢您的回答。但是我还添加了另一个场景,当我在构建路径中将aa.bb作为jar文件添加到包中时,并且还从aa.bb文件夹中删除了aa类的源代码。然后它不显示任何错误。 –

+0

_that当我添加package_没有得到它 –

+0

哦对不起。我用aa.bb包创建了另一个项目,并创建了一个jar包。现在将该jar添加到此项目的构建路径中。现在错误是一样的。现在,我只在包aa.bb中添加了类bb,现在没有编译时错误。 –