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

Java 扩展抽象类的奇怪行为(练习),java,eclipse,oop,inheritance,javac,Java,Eclipse,Oop,Inheritance,Javac,我正在学习JavaSE7认证考试,我正在做一些关于继承和访问修饰符的枯燥练习 但是现在我得到了一个应用继承的意外行为。在我的基本包com.testpkg中,我有一个抽象类: package com.testpkg; public abstract class Abstract { public int test(); } 注意我自愿省略了test()方法的abstract修饰符 然后我在packagecom.testpkg.sub中有一个扩展Abstract的具体类: packa

我正在学习JavaSE7认证考试,我正在做一些关于继承和访问修饰符的枯燥练习

但是现在我得到了一个应用继承的意外行为。在我的基本包
com.testpkg
中,我有一个抽象类:

package com.testpkg;

public abstract class Abstract {

    public int test();

}
注意我自愿省略了
test()
方法的
abstract
修饰符

然后我在package
com.testpkg.sub
中有一个扩展
Abstract
的具体类:

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
将打印在控制台上

这对我来说似乎很奇怪。你能解释一下为什么在
Abstract
类中错误地声明了
test()



注意我正在使用EclipseIDE编译/运行我的代码。

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

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

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

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

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

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

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

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

Eclipse允许您运行“半成品”代码。它在这里运行良好的原因是,在运行时,您永远不会真正依赖于
抽象类的细节,因此,如果您有这种类型的编译错误,这其实并不重要。

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

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

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

如果您的代码没有编译,您的代码如何运行?@WIll我正在使用Eclipse。它提醒存在编译错误,但请允许我运行代码。我相信这就是您问题的答案。Eclipse允许您运行“半成品”代码。它在这里运行良好的原因是,在运行时,您从未真正依赖于
抽象类的细节,因此,如果其中存在这种类型的编译错误,这并不重要。您是否尝试过在构建之前清理项目?正如其他人指出的,您可能有一个基于正确抽象类版本的类文件。@Benjamin是的,我已经尝试过清理项目。什么都没变。如果你的代码没有编译,它会如何运行?@WIll我正在使用Eclipse。它提醒存在编译错误,但请允许我运行代码。我相信这就是您问题的答案。Eclipse允许您运行“半成品”代码。它在这里运行良好的原因是,在运行时,您从未真正依赖于
抽象类的细节,因此,如果其中存在这种类型的编译错误,这并不重要。您是否尝试过在构建之前清理项目?正如其他人指出的,您可能有一个基于正确抽象类版本的类文件。@Benjamin是的,我已经尝试过清理项目。什么都没变。如果你的代码没有编译,它会如何运行?@WIll我正在使用Eclipse。它提醒存在编译错误,但请允许我运行代码。我相信这就是您问题的答案。Eclipse允许您运行“半成品”代码。它在这里运行良好的原因是,在运行时,您从未真正依赖于
抽象类的细节,因此,如果其中存在这种类型的编译错误,这并不重要。您是否尝试过在构建之前清理项目?正如其他人指出的,您可能有一个基于正确抽象类版本的类文件。@Benjamin是的,我已经尝试过清理项目。什么都没变。如果你的代码没有编译,它会如何运行?@WIll我正在使用Eclipse。它会提醒存在编译错误,但请允许我