interface TestInterface{
public void sayHello();
}
class A implements TestInterface{
public void sayHello(){
System.out.println("Hello");
}
public void sayBye(){
System.out.println("Hello");
}
public String toString(){
return "Hello";
}
public static void main(String args[]){
TestInterface ti=new A();
ti.sayHello();
ti.sayBye();//error
ti.toString();//How toString method can be called as it is not the part of the interface contract.
}
}
答案 0 :(得分:4)
来自this section in the Java Language Specification:
如果接口没有直接的超接口,则接口隐式声明
\d{3}(?= )\d{3}
成员方法m,其中包含签名s,返回类型r和public abstract
子句t,对应于每个throws
实例方法m带有签名s,返回类型为r,public
子句t 在throws
中声明,除非Object
方法具有相同的签名,返回类型相同,并且接口显式声明了兼容的throws子句。
所以abstract
的公共方法如Object
在所有接口中都是隐式声明的。
答案 1 :(得分:1)
toString
,因为任何接口的任何实现都必须是Object的子类,其中包含toString
方法。
为了调用接口中未出现的任何其他方法或接口扩展的任何超级接口(并且未在Object
类中定义),必须将接口强制转换为类型包含该方法的类。
答案 2 :(得分:0)
每个对象都是Object
:)在对象上调用Object
方法是有意义的。
问题的核心 - 所有参考类型都是Object
的{{3}}。参考类型包括
T
)null
)A&B
)子类型从超类型继承方法。因此,所有引用类型都继承Object
方法。
答案 3 :(得分:-2)
这是OO语言的本质。接口仅定义一组具体类需要实现的方法签名。它们不限制类的性质(抽象具体)。
因此,当您声明TestInterface ti
时,在您的示例中A
实现TestInterface
,因此它是TestInterface
的实例。同样class B implements TestInterface {...}
也有效。
TestInterface ti = new A(); // Valid
ti = new B(); // Also valid (given the above definition)