出于某种原因,我似乎无法在定义它的包之外实现抽象类。 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版本。当然不是在同一时间:)
答案 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)
您有四个访问修改器:
- 公众 - 你可以在任何地方使用它
- 私人 - 你只能在班级内使用它
- 受保护 - 您只能使用内部类和继承它的类
- 包访问(默认,不带修饰符) - 您只能在类所属的包中使用它
在这种情况下,您没有修饰符,通常将其视为包访问。