13

如何使用没有方法toString的 interface 的引用变量调用方法?TesttoString

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);
    }
}
4

8 回答 8

14

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()在接口引用上调用该方法的原因

于 2012-08-25T17:34:11.420 回答
11

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

于 2012-08-25T17:30:27.717 回答
6

任何Object人都有toString()方法。任何会实现接口的东西都会隐式地扩展Object,所以也会有一个toString()方法。

于 2012-08-25T17:30:27.053 回答
2

您能够通过接口的该变量调用该方法的原因是在 Java 中的接口情况下进行了特殊处理。

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

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

你会在这里找到更好的解释——接口真的继承了 Java 中的 Object 类吗? .

于 2012-08-25T17:43:33.667 回答
2

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

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

于 2012-08-25T17:30:40.250 回答
2

由于类Demo隐含extendsObject,它继承方法toString。并且由于这不是一种abstract方法,因此类Demo不必提供实现,尽管您可以直接toString调用Demo. 有关更多信息,请参阅课程:接口和继承

ObjectAPI 中所述,

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

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

于 2012-08-25T17:32:31.903 回答
1

toString在内部声明Object。当一个Object实现一个接口时,它必须有一个toString方法。

因此,任何对象引用,无论是接口还是枚举,都必须具有所有对象方法:

  • 克隆
  • 等于
  • 敲定
  • 获取类
  • 哈希码
  • 通知
  • 通知所有
  • 等待
于 2012-08-30T15:01:17.943 回答
0

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

于 2012-08-25T17:33:45.120 回答