我正在攻读Java SE 7认证考试,我正在做一些关于继承和访问修饰符的无聊练习。
但是现在我正在应用继承的意外行为。在我的基础包com.testpkg
中,我有一个抽象类:
package com.testpkg;
public abstract class Abstract {
public int test();
}
注意我自愿省略了abstract
方法的test()
修饰符。
然后我在包Abstract
中扩展了com.testpkg.sub
的具体课程:
package com.testpkg.sub;
public class Concrete extends Abstract {
public int test() {
return 0;
}
}
我使用以下方法测试这些类:
package com.testpkg;
import com.testpkg.sub.Concrete;
public class TestMain {
public static void main(String[] args) {
Abstract c = new Concrete();
System.out.println(c.test());
}
}
如果我尝试编译它,我显然会遇到两个错误:
The method test() requires a body instead of a semicolon
但如果我运行测试类:控制台上会打印0
这对我来说似乎很奇怪。你能解释为什么代码工作,test()
类错误地声明了Abstract
吗?
注意我正在使用Eclipse IDE来编译/运行我的代码。
答案 0 :(得分:2)
您的abstract
方法需要test()
限定词。您可能正在运行旧的类文件。如果将return语句的值更改为0以外的值,则会看到它没有运行此代码。
答案 1 :(得分:1)
Eclipse允许您运行“半烘焙”代码。它在这里运行正常的原因是因为在运行时,你永远不会真正依赖Abstract
类的细节,所以如果你有这种类型的编译错误并不重要。
答案 2 :(得分:0)
您的类Abstract
有编译错误,因为应该定义非抽象方法,因此它应该有一个主体。 abstract
限定符仅在接口的情况下是可选的。