2015-07-29 2 views
1

Ниже interface I неявно имеет общедоступные методы class Object в качестве абстрактных членов. Одним из них является toString()Как здесь называется «toString»?

interface I{ 
    void test(int i); 
    //implicitly has abstract members matching every public method of 'class Object' 
    // one of them is toString() 
} 

Ниже class W наследует class Object публичные методы, один из них является toString,

class W implements I{ 
    public static void main(String[] args){ 
     I w = new W(); 
     w.toString(); //How toString() method is resolved here? 
    } 
} 

Как как, супер интерфейс (I) и супер класс (Object) из class WестьtoString() способ,

Как javac решить w.toString() во время компиляции? Я узнал, что здесь используется инструкция invokevirtual.

Как разрешает jvm w.toString() во время выполнения?

+2

'interface' не отменяет ничего из' Object' ... – MadProgrammer

+0

Я не вижу проблемы здесь? Интерфейс не является абстрактным классом, если это ваше замешательство, а метод, определенный в интерфейсе, никогда не переопределяет метод в классе. –

+0

@ErwinBolwidt Когда я говорю: 'interface I {public int equals (Object obj); } 'Я получаю ошибку компилятора, возвращаемый тип несовместим с Object.equals (obj)'. Как я понимаю это? Причина в том, что любой интерфейс, который не имеет супер интерфейса, implicilty имеет элементы, соответствующие каждому публичному методу в «Object»? который отличается от переопределения? – overexchange

ответ

2

Поскольку метод вызывается выражение типа I, типа интерфейса, байт-код будет содержать invokeinterface инструкцию для соответствующего метода.

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

Пусть C класс objectref.Фактический метод должен быть вызван в выбирается по следующей методике поиска:

  • Если C содержит объявление для метода экземпляра с тем же именем и дескриптор в качестве разрешенного метода, то метод должен быть вызван.
  • В противном случае, если C имеет суперкласс, поиск для описания метода экземпляра с тем же именем и дескриптором, как выполняются разрешенный метод, начиная с прямым суперклассом C и продолжения с прямым суперклассом, что класс и т. д., до тех пор, пока не будет найдено совпадение или не будут созданы дополнительные суперклассы. Если найдено совпадение , то это метод вызова.
  • В противном случае, если существует ровно один максимально-специфичный метод (§5.4.3.3) в суперинтерфейсах C, который соответствует имя и дескриптор устраненных метод и не является абстрактным, то это метод, который будет вызван.

В вашем случае objectref является ссылкой на объект типа W. Wне содержит объявление для метода экземпляра с тем же именем и дескриптором, что и разрешенный метод. Поэтому мы проверяем суперкласс W, Object. Object. есть такой способ. Поэтому этот метод вызывается.

1

interface не отменяет метод.

Также ваш класс не переопределяет метод toString(). Вы должны переписать метод toString(), чтобы переустановить его.

Так что это просто реализация toString() суперкласса Object.

0

Интерфейсы не переопределяют методы из любого класса. Когда вы используете метод toString(), по умолчанию toString() выполняется из класса Object, потому что ваш класс W распространяется от Object. Для получения дополнительных пояснений переопределите метод toString() в вашем классе W.

@Override 
public String toString() { 

    return "Yo, baby! M here!"; 
} 

Тогда выход будет:

Yo, baby! M here! 
-2

интерфейс не имеет супер класс даже не класс объекта, например,

public class Main { 
    public static void main(String[] argv) throws Exception { 

    Class cls = java.lang.Cloneable.class; 
    Class sup = cls.getSuperclass(); // will return null 
    } 
} 

Следовательно, интерфейс никогда не отменяет метод класса Object.

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

Смежные вопросы