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

У интерфейсов есть метод toString?

Как можно вызвать метод toString, используя ссылочную переменную интерфейса Test, которая не имеет метода toString?

interface Test
{
    void show();
    String toHi();
}
class Demo implements Test
{
    public void show(){
        System.out.println("Show");
    }
    public String toString(){
        return "Hello"; 
    }
    public String toHi(){
        return "Hi";    
    }

    public static void main(String[] args) 
    {
        Test t=new Demo();
        String s=t.toString();
        System.out.println(s);
    }
}
4b9b3361

Ответ 1

В документации Java...

When an interface has no direct SuperInterface, it will create abstract public method for all those public methods present in the Object class.

Вот почему вы можете вызвать метод toString() в ссылке на интерфейс

Ответ 2

Object имеет метод toString(), поэтому все (кроме примитивных типов) имеет метод toString(). Java будет обрабатывать все, даже пустой интерфейс, как имеющие все методы Object, потому что он всегда делает.

Ответ 3

Любой Object имеет метод toString(). Все, что будет реализовывать интерфейс, неявно расширяет Object, поэтому также будет иметь метод toString().

Ответ 4

Класс C реализует My, но также расширяет Object, поскольку все объекты в конечном итоге производят в своем дереве наследования.

Класс Object имеет метод toString(), а также ряд других.

Ответ 5

Причина, по которой вы можете вызвать этот метод через эту переменную вашего интерфекса, вызвана особым обращением в случае интерфейсов на Java.

Несмотря на то, что метод явно не объявлен в интерфейсе, специальное обращение неявно предоставляет декларации для всех методов открытого экземпляра, определенных в классе Object. И метод toString является одним из них.

Но обратите внимание, что интерфейсы не неявно расширяют любой суперинтерфейс (или класс) в отличие от классов, которые неявно расширяют класс Object.

Здесь вы найдете лучшее объяснение - Действительно ли интерфейсы наследуют класс Object в Java?.

Ответ 6

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

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

Итак, вы можете сделать что-то вроде этого:

public static void main(String[] args) 
    {
        My m=new C();
        String s= m + ""; // the toString() of the C class will be called here
        System.out.println(s);
    }

Ответ 7

Так как class Demo неявно extends class Object, он наследует метод toString. И поскольку это не метод abstract, класс Demo не вынужден предоставить реализацию, хотя вы можете напрямую вызывать toString в экземпляре Demo. Для получения дополнительной информации см. Урок: интерфейсы и наследование.

Как указано в Object API,

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

Также обратите внимание, что метод toString не является частью определения интерфейса, а скорее определением класса Object.

Ответ 8

Каждый объект (кроме примитивных типов) в java имеет метод toString().