如何使用没有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);
}
}
答案 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
隐含extends
类Object
,因此它继承了方法toString
。由于这不是abstract
方法,因此虽然您可以在Demo
的实例上直接调用toString
,但类Demo
不会被强制提供实现。有关详细信息,请参阅Lesson: Interfaces and Inheritance。
如Object
API中所述,
类
Object
是类层次结构的根。每个班级都有Object
作为超类。所有对象,包括数组,都实现了 这类方法。
另请注意,toString
方法不是接口定义的一部分,而是Object
类定义。
答案 7 :(得分:0)
java中的每个Object(基本类型除外)都有一个toString()方法。