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

Путаница по вызову Метод интерфейса Java

Допустим, у меня есть интерфейс A, определенный следующим образом:

public interface A {
  public void a();
}

Он включает метод void a();

У меня есть класс, который реализует этот интерфейс и имеет только один метод:

    public class AImpl implements A {
       @Override
       public void a() {
           System.out.println("Do something");
       }
    }

Q: Если в основном классе я вызываю интерфейсный метод, вызовет ли он реализацию, принадлежащую классу, который реализует интерфейс?

Например:

public static void main(String[] args){
  A aa;
  aa.a();
}

Будет ли эта печать "Делать что-нибудь"?

4b9b3361

Ответ 1

A aa = new AImpl();
aa.a();

Здесь ваша ссылочная переменная - это интерфейс A type, но фактический Object - AImpl.

Когда вы определяете новый интерфейс, вы определяете новые ссылочные данные тип. Вы можете использовать имена интерфейсов везде, где вы можете использовать любые другие данные имя типа. Если вы определяете ссылочную переменную, тип которой является интерфейс, любой объект, который вы ему назначили, должен быть экземпляром класса который реализует интерфейс.

Подробнее о Документация

Ссылка на интерфейс может содержать объект AImpl, поскольку он реализует интерфейс A.

Ответ 2

Это зависит от типа среды выполнения объекта. См:

Это ваш интерфейс:

public interface A {
  public void a();
}

И это ваш класс:

public class AImpl implements A {
    public void a() {
       println("I am AImpl");
    }
}

Существует еще одна реализация:

public class AnotherAImpl implements A {
    public void a() {
       println("I am another AImpl");
    }
}

Итак, взгляните на этот основной метод:

public static void main(String[] args){
  A aa;
  aa = new AImpl();
  aa.a(); // prints I am AImpl
  aa = new AnotherAImpl();
  aa.a(); // now it prints I am another AImpl
}

Ответ 3

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

A aa = new AImpl();
aa.a();

что здесь эквивалентно следующему

AImpl aa = new AImpl();
aa.a();

Ваш образец вызовет ошибку, так как вы пытаетесь вызвать метод на неинициализированном объекте.

Ответ 4

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

В настоящее время вы получите NullPointerException, потому что вы ничего не назначили переменной aa. Изменение кода на следующий будет вызывать метод и выводить текст:

public static void main(String[] args){
    A aa = new AImpl();
    aa.a();
}

Ответ 5

Нет. Я не буду.

Вы указали переменную. Сначала вы должны сначала инициализировать экземпляр объекта в этом случае вашим классом AImpl.

public static void main(String[] args){
  A aa = new AImp();
  aa.a();
}