如何在Interface类型的引用上调用Object类的方法?

时间:2015-06-01 11:17:37

标签: java interface

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.
   }
}

4 个答案:

答案 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 type(for 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)