4

由于某种原因,我似乎无法在定义它的包之外实现抽象类。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 Runtime Environment (build 1.6.0_31-b04-415-10M3646) - OpenJDK Runtime Environment (build 1.7.0-u4-b13-20120301) 尝试了两个 Java 版本。当然不是同时 :)

4

3 回答 3

14

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

abstract Long foo();

如果一个方法没有修饰符(默认,也称为包私有),它只在自己的包中可见

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

protected abstract Long foo();

信息

于 2012-05-29T12:31:44.390 回答
7

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

目前尚不清楚您希望他们拥有什么级别的访问权限,但最简单的方法可能是将它们都公开。目前,您是说只有 callers inpackage1可以 call BaseClass.foo(),但只有 callers inpackage2可以 call Implement2.foo()。这显然没有多大意义。您希望谁能够访问该方法?如果您只希望类或子类中的调用者能够调用它,那么 make it protected- 否则 make it public

有关访问修饰符的更多详细信息,请参阅Java 语言规范(和Java 教程)的第 6.6 节。特别是,在经历了各种访问修饰符之后:

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

于 2012-05-29T12:34:17.520 回答
4

你有四个访问修饰符:
- public - 你可以在任何地方使用它
- private - 你只能在类中使用它
- protected - 你只能在类和继承它的类中使用
- 包访问(默认,没有修饰符) - 你可以仅在该类所属的包中使用它。

在这种情况下,您没有修饰符,通常将其视为包访问。

于 2012-05-29T12:36:17.133 回答