#java #class #interface #overriding
#java #класс #интерфейс #переопределение
Вопрос:
Я получаю это сообщение об ошибке, которое не должно отображаться. Прежде всего, после создания интерфейса я скопировал его метод во все классы, которые реализуют этот интерфейс, но ошибка все еще отображается.
в настоящее время это выглядит так:
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 класса…
Комментарии:
1.
double getField();
иdouble getField(double r);
это не одно и то же.2. Форма не импортируется, а создается (и ДА — данная проблема ТРЕБУЕТ создания собственного интерфейса формы). И почему они не совпадают — разрушает ли добавление конструктора (расширение реализованного метода)?
3. Нет, у метода есть сигнатура , которая идентифицирует метод. Сигнатура — это имя плюс список типов параметров. Если метод имеет то же имя, но разные типы параметров, он считается другим методом. Метод с тем же именем, но с другим введенным параметром называется перегрузкой .
Ответ №1:
У вас есть:
interface Shape {
String getShapeName();
double getField();
}
однако вы явно указываете в своих подклассах, что вы переопределяете:
@Override
public double getField(double r) {...}
double getField()
и double getField(double r)
это не одно и то же.
Переопределение и скрытие методов:
Метод экземпляра в подклассе с той же сигнатурой (имя, плюс номер и тип его параметров) и типом возвращаемого значения, что и метод экземпляра в суперклассе, переопределяет метод суперкласса.
Примечание: @Override
(которое является @Retention(SOURCE)
) аннотацией поверх вашего метода, заставляет вас переопределять соответствующий метод, иначе вы не сможете скомпилировать свой файл.