переопределение метода с использованием интерфейса - PullRequest
0 голосов
/ 21 сентября 2009
    interface I
    {
       void show();
    } 

    class A implements I
    {
    void show()
    {
       System.out.println("class A");
     }
    public static void main(String s[])
    {
      I i=new A();
      i.show();
      i.toString();
    }
  }

Q> В качестве интерфейса I не содержится абстрактный метод toString (), но все же следующий код компилируется. Как?

когда переменная суперкласса используется для ссылки на подкласс obj, тогда компилятор сначала ищет похожий метод в суперклассе, если не найден, выдает ошибку. здесь интерфейс не содержит метод toString ().

ех =>

class A
{
  void show()
  {
   System.out.println("show");
  }
}

class B
{
  void show()
  {
   System.out.println("show B");
  }

  void display()
  {
   System.out.println("display B");
  }

  public static void main(String s[])
  {
    A a=new B();
    a.show();           //will execute
    a.display();        //give error 
} 

Ответы [ 4 ]

7 голосов
/ 21 сентября 2009

Все классы наследуются от Object. Объект имеет строку toString.

Чтобы использовать любой интерфейс, он должен быть поддержан реальным классом. Таким образом, компилятор Java знает, что он может использовать любой метод, определенный в java.lang.Object при работе с интерфейсом.

Проще говоря, немного по-другому:

interface I { ... }

имеет "магию"

interface I extends Object { ... }

Таким образом, вы можете использовать методы Objects при детализации с I. Однако вы не можете использовать любые методы в конкретном классе, которые не отображаются в интерфейсе. Итак, чтобы объединить два примера:

interface Car { 
   void drive();
}

class Convertible implements Car { 
  void drive() {} 
  void openRoof() {} 

  public static void main() {
     Car porscheBoxster = new Convertible();
     porscheBoxster.drive(); // OK - exists in interface
     porscheBoxster.toString(); // OK - exists in java.lang.Object.
     porscheBoxster.openRoof(); // Error. All we know is the porscheBoxster is of type Car. 
         // We don't know if it is a Convertible or not.
  }
}
3 голосов
/ 21 сентября 2009

Каждый класс в Java является объектом , поэтому они всегда могут запускать следующие методы:

  • Клон ()
  • равен (Объект) * +1008 *
  • завершить ()
  • GetClass ()
  • хэш-код ()
  • извещать ()
  • notifyAll ()
  • ToString ()
  • ожидание ()
  • ожидание (длинный)
  • wait (long, int)
2 голосов
/ 21 сентября 2009

Поскольку toString () находится в классе Object, из которого получены все не примитивные данные. Таким образом, у каждого объекта есть этот метод.

1 голос
/ 21 сентября 2009

В Java каждый создаваемый вами класс наследуется от базового класса Object. Это означает, что в вашем классе по умолчанию будет много полезных методов, в том числе toString ().

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