无法从其他包实现抽象类

时间:2012-05-29 12:30:21

标签: java abstract-class

出于某种原因,我似乎无法在定义它的包之外实现抽象类。 package1中的抽象类无法在package2中的类中实现。为什么这不是合法的Java?

package com.stackoverflow.abstraction.package1;

abstract public class BaseClass {
    abstract Long foo();
}

package com.stackoverflow.abstraction.package1;

public class Implement1 extends BaseClass {
    @Override
    Long foo() {
        return null;
    }
}


package com.stackoverflow.abstraction.package2;

import com.stackoverflow.abstraction.package1.BaseClass;

/** Compiling this class will output
* - Implement2 is not abstract and does not override abstract method foo() in BaseClass
* - error: method does not override or implement a method from a supertype
*/

public class Implement2 extends BaseClass {
    @Override
    Long foo() {
        return null;
    }
}

运行: OS X 10.6.8 - Java(TM)SE运行时环境(版本1.6.0_31-b04-415-10M3646) - OpenJDK运行时环境(版本1.7.0-u4-b13-20120301) 尝试了两个Java版本。当然不是在同一时间:)

3 个答案:

答案 0 :(得分:11)

该方法是包级别可见性,因此您无法在其他包中覆盖它。

abstract Long foo();
  

如果方法没有修饰符(默认值,也称为   package-private),它只在自己的包中可见

如果您确实需要覆盖它,请改为protected

protected abstract Long foo();

<强>信息

答案 1 :(得分:7)

您的两个foo方法具有默认的“包”访问权限。您的Implementation2类甚至无法调用方法 - 因此能够覆盖它没有多大意义。

目前尚不清楚你想要他们拥有什么级别的访问权限,但最简单的方法可能是将它们公之于众。目前,您只是说package1中的来电者可以拨打BaseClass.foo(),但只有package2的来电者可以拨打Implement2.foo()。这显然没有多大意义。您想要谁能够访问该方法?如果您只希望类或子类中的调用者能够调用它,那么将其设为protected - 否则将其设为public

有关访问修饰符的详细信息,请参阅section 6.6 of the Java Language Specification(以及Java tutorial)。特别是,在浏览了各种访问修饰符之后:

  

否则,我们说有默认访问权限,只有在声明类型的包中发生访问时才允许访问。

答案 2 :(得分:4)

您有四个访问修改器:
- 公众 - 你可以在任何地方使用它 - 私人 - 你只能在班级内使用它 - 受保护 - 您只能使用内部类和继承它的类 - 包访问(默认,不带修饰符) - 您只能在类所属的包中使用它
在这种情况下,您没有修饰符,通常将其视为包访问。