Подтвердить что ты не робот

Тот же метод в интерфейсе и абстрактном классе

Я пришел в ситуацию:

public interface Intr {
    public void m1();
}

public abstract class Abs {
    public void m1() {
        System.out.println("Abs.m1()");
    }
    // public abstract void m1();
}

public class A extends Abs implements Intr {

    @Override
    public void m1() {
        // which method am I overriding, well it is Abs.m1() but why?
        // if method implemented is Abs.m1(), then why I am not getting error for Intr.m1() not implemented.
    }

}
4b9b3361

Ответ 1

Вы одновременно выполняете оба условия; то есть. одна реализация в то же время выполняет требования абстрактного класса и требования к интерфейсу.

В качестве примечания, если вы не используете Intr в другой цепочке наследования, вам это не нужно. Кроме того, имеет смысл перемещать implements Intr до определения абстрактного класса.

Ответ 2

Вы можете переопределять только методы, определенные в другом классе.

Способы, объявленные в интерфейсе, просто реализуются. Это различие существует в Java для решения проблемы множественного наследования. Класс может распространять только один родительский класс, поэтому любые вызовы super будут разрешаться без двусмысленности. Однако классы могут реализовывать несколько интерфейсов, которые могут объявить один и тот же метод. Лучше всего думать о интерфейсах как о списке "must have" s: чтобы квалифицироваться как Comparable, ваш cluss должен иметь метод compareTo(), но не имеет значения, откуда он пришел или какие другие интерфейсы требуют того же метода.

Итак, технически вы переопределяете Abs.m1() и реализуете Intr.m1() одним махом.

Обратите внимание, что это тоже будет хорошо:

public class B extends Abs implements Intr {

    //m1() is inherited from Abs, so there no need to override it to satisfy the interface
}

Ответ 3

@Override гарантирует, что вы переопределите метод без разницы интерфейса или абстрактного суперкласса. Таким образом, ошибка с переопределением.

С другой стороны, метод интерфейса также реализуется в суперклассе, которого достаточно для контракта с интерфейсом.

Ответ 4

Здесь и интерфейс, и абстрактный класс имеют тот же метод.

У вас есть одно имя класса, приветствующее и расширяющее абстрактный класс, и реализующий интерфейс его true, и вы переопределяете метод met1 на класс hello, и его компиляция корректно и не дает никакой ошибки, но она не может определить, какой метод класса переопределен как абстрактный класс или интерфейс.

Это полиморфизм во время выполнения, который вы не можете создать объект абстрактного класса и интерфейса, но вы можете создать ссылочную переменную. Здесь решение - вы не можете определить, что во время компиляции его фактическое переопределение во время выполнения.

interface hi
{
    public void meth1();
}
abstract class Hullo
{
    public abstract void meth1();
}
public class Hello extends Hullo implements hi
{
    public void meth1(){
        System.out.println("hello");
    }
        hi h= new Hello();
        h.meth1();//its means interface method is override. and its decide when we call method.
        hullo hu= new Hello();
        hu.meth1();//its means abstract class method is override.
}