Проблема с интерфейсной переменной - PullRequest
4 голосов
/ 06 января 2011

Я изучал, что в случае методов экземпляра во время выполнения jvm использует фактический класс экземпляра, а в случае методов класса компилятор будет смотреть только на объявленный тип ссылочной переменной, а не на реальный класс.

Я изучал скрытие этого метода экземпляра концепции.

И в своей программе я использовал переменную ссылки интерфейса для хранения объекта класса и пытался получить доступ к методу экземпляра класса, используяэто, но это вызывает ошибку .. Моя программа выглядит следующим образом:

interface A
{
   void show();
}
class B implements A
 {
   public void show()
   {
      System.out.println("Interface Method");
   }
    void info()
  {
     System.out.println("IN Info");
  }
}
class interDemo
{
   public static void main(String args[])
  {
     A a;
     B b=new B();
      a=b;
      a.show();
      a.info();
  }
}

Пожалуйста, помогите мне понять концепцию ...

Ответы [ 4 ]

7 голосов
/ 06 января 2011

Компилятор сообщает, что для типа A не определен метод с именем info.Это правда: компилятор не знает, что в время выполнения тип a будет фактически B, который имеет метод info.Было бы небезопасно допустить, чтобы вызов a.info() действительно компилировался и передавался в байт-коды; нет ничего, чтобы сказать, что a всегда будет иметь тип B.

Это известно как статическая типизация .В Java и других статически-типизированных языках вам необходимо «привести» переменную, чтобы компилятор воспринял ее как другой тип.В этом случае вы можете написать ((B) a).info().

1 голос
/ 06 января 2011

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

Вкратце: статический тип a равен A. После присвоения b a, динамический тип a равен B. Так что в этот момент статический тип a равен A, а динамический тип a равен B.следовать динамическим типам, он проверяет только статические типы.Так что он не даст ничего сделать, кроме того, что позволит статический тип.

Так что в вашем примере, если вы используете ссылку статического типа A, вы можете вызывать только методы из класса A.

1 голос
/ 06 января 2011

sjr правильно. Вот еще один способ взглянуть на это:

Вы указываете, что A может только show. Это означает, что когда у вас есть A ссылочная переменная, это все, что вы можете сделать.

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

0 голосов
/ 22 января 2014

супер концепция без путаницы
==================================== *=====

2 правила, чтобы узнать, откуда будет выполняться метод (когда для вызова методов используется ссылка на супер тип)

ПРИМЕЧАНИЕ: проверьте оператор "создание объекта" / "назначение ссылки" для применения правила

1 ПРАВИЛО: 1-я проверка вызываемого метода. Если статический / перегруженный / одиночный - тогда он становится статическим полиморфизмом / статическим (компилятор ищет ссылочный тип) ---следовательно, всегда выполняется из ссылочного типа

2 ПРАВИЛО: метод проверки, который будет вызван - если переопределен - тогда он становится динамический полиморфизм (jvm ищет тип объекта) --- следовательно, всегда выполняется из типа объекта (т. е. право на новое ключевое слово)

, например:

super s=new child();

s.play();

здесь 2 случая:

1-й : проверьте, что play () является статическим (статический / перегруженный / одиночный метод) или динамическим (переопределенным)

2-м: , еслистатический он будет исполняться из супер т.е.тип ference приводит к полиморфизму времени компиляции

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...