0

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

4

3 回答 3

2

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

于 2013-11-04T11:33:57.253 回答
1

Eclipse 允许您运行“半生不熟”的代码。它在这里运行良好的原因是,在运行时,您从不真正依赖Abstract类的细节,因此如果您有这种类型的编译错误并不重要。

于 2013-11-04T12:43:19.417 回答
0

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

于 2013-11-04T11:31:46.383 回答