接口有toString方法吗?

时间:2012-08-25 17:28:14

标签: java interface

如何使用没有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);
    }
}

8 个答案:

答案 0 :(得分:12)

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()方法的原因

答案 1 :(得分:11)

Object有一个toString()方法,因此所有(原始类型除外)都有toString()方法。 Java会将任何东西,甚至是空接口都视为拥有Object的所有方法,因为它始终如此。

答案 2 :(得分:5)

任何Object都有toString()方法。任何实现接口的东西都会隐式扩展Object,因此也会有toString()方法。

答案 3 :(得分:2)

C实现My但它也扩展Object,因为所有对象最终都在其继承树中执行。

Object类确实有方法toString()以及其他一些方法。

答案 4 :(得分:2)

您能够通过interfce的变量调用该方法的原因是由于Java中的接口的特殊处理。

尽管该方法未在接口中显式声明,但特殊处理隐式地为类Object中定义的所有公共实例方法提供声明。 toString方法就是其中之一。

但请注意,接口不会隐式扩展任何超级接口(或类),这与隐式扩展Object类的类不同。

您可以在此处找到更好的解释 - Do Interfaces really inherit the Object class in Java?

答案 5 :(得分:2)

您不能调用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);
    }

答案 6 :(得分:1)

由于类Demo隐含extendsObject,因此它继承了方法toString。由于这不是abstract方法,因此虽然您可以在Demo的实例上直接调用toString,但类Demo不会被强制提供实现。有关详细信息,请参阅Lesson: Interfaces and Inheritance

Object API中所述,

  

Object是类层次结构的根。每个班级都有   Object作为超类。所有对象,包括数组,都实现了   这类方法。

另请注意,toString方法不是接口定义的一部分,而是Object类定义。

答案 7 :(得分:0)

java中的每个Object(基本类型除外)都有一个toString()方法。