奇怪的行为扩展抽象类(练习)

时间:2013-11-04 11:13:46

标签: java eclipse oop inheritance javac

我正在攻读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来编译/运行我的代码。

3 个答案:

答案 0 :(得分:2)

您的abstract方法需要test()限定词。您可能正在运行旧的类文件。如果将return语句的值更改为0以外的值,则会看到它没有运行此代码。

答案 1 :(得分:1)

Eclipse允许您运行“半烘焙”代码。它在这里运行正常的原因是因为在运行时,你永远不会真正依赖Abstract类的细节,所以如果你有这种类型的编译错误并不重要。

答案 2 :(得分:0)

您的类Abstract有编译错误,因为应该定义非抽象方法,因此它应该有一个主体。 abstract限定符仅在接口的情况下是可选的。