Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类不是抽象的,并且不重写抽象方法错误。。。虽然它实现了方法_Java_Class_Interface_Overriding - Fatal编程技术网

Java 类不是抽象的,并且不重写抽象方法错误。。。虽然它实现了方法

Java 类不是抽象的,并且不重写抽象方法错误。。。虽然它实现了方法,java,class,interface,overriding,Java,Class,Interface,Overriding,我收到这个错误消息,它不应该显示。 首先,在创建接口之后,我将其方法复制到实现该接口的所有类中,但错误仍然显示出来 目前看起来是这样的: interface Shape { String getShapeName(); double getField(); } class Circle implements Shape { String name; double r; public Circle(String name, double r) {

我收到这个错误消息,它不应该显示。 首先,在创建接口之后,我将其方法复制到实现该接口的所有类中,但错误仍然显示出来

目前看起来是这样的:

interface Shape {
    String getShapeName();

    double getField();
}

class Circle implements Shape {
    String name;
    double r;

    public Circle(String name, double r) {
        this.name = name;
        this.r = r;
    }

    @Override
    public double getField(double r) {
        return Math.PI * Math.pow(r, 2);
    }

    @Override
    public String getShapeName() {
        return this.name;
    }
}

class Square implements Shape {
    String name;
    double a;

    public Square(String name, double a) {
        this.name = name;
        this.a = a;
    }

    @Override
    public double getField(double a) {
        return Math.pow(a, 2);
    }

    @Override
    public String getShapeName() {
        return this.name;
    }
}

class Triangle implements Shape {
    String name;
    double a;
    double b;
    double c;

    public Triangle(String name, double a, double b, double c) {
        this.name = name;
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public double getField(double a, double b, double c) {
        double p = (a + b + c) / 2;
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }

    @Override
    public String getShapeName() {
        return this.name;
    }
}
我不知道为什么。。。我看到这个问题被问了几次,但在大多数情况下,这是因为没有从接口实现某些方法(或者键入错误的方法名称,这不是我的情况,因为接口方法被复制到所有3个类…

您有:

界面形状{
字符串getShapeName();
双getField();
}
但是,您在子类中明确声明,您将覆盖:

@覆盖
公共双getField(双r){…}
double getField()
double getField(double r)
不一样

:

子类中的实例方法与超类中的实例方法具有相同的签名(名称,加上其参数的编号和类型)和返回类型,将覆盖超类的方法


旁注:(它是方法顶部的
@Retention(SOURCE)
)注释,强制您重写相应的方法,否则您将无法编译文件。

double getField();
double getField(double r);
不相同。形状不是导入的,而是创建的(是的,这个问题是创建自己的形状接口所必需的)。为什么它们不一样呢?添加构造函数(扩展实现的方法)破坏它?不,一个方法有一个签名,它标识一个方法。签名是名称加上一系列参数类型。如果一个方法有相同的名称,但参数类型不同,则被认为是不同的方法。具有相同名称但参数类型不同的方法被称为重载。