请在下方找到解释问题的代码段。
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
I ref = new B();
ref.equals("");
}
}
interface I{
}
class A {
public void method(){
}
}
class B extends A implements I{
}
请参阅main()
,允许ref.equals()
,但不允许ref.method()
。为什么会这样?
编辑: 对象是B(或A或任何其他类)的超类,但同样的方式A也是B的超类。我的问题是为什么A的'method()'在'ref'中不可见,即为什么允许ref.equals()但是ref.method()不是?如何进行此方法可见性检查?它是否植根于JVM?
答案 0 :(得分:7)
那是因为你确实把它声明为I:
I ref = new B();
您只能看到我在and the methods from Object
中声明的方法。
当你这样做时:
将其声明为A:
A ref = new B();
或将其声明为B
B ref = new B();
或将其投射到A
I ref = new B();
((A)ref).method()
您将有权访问:
ref.method()
如果你想看A和I中的方法,你可以把它们放在它们之间。或者也有我的工具。
答案 1 :(得分:2)
Java Language Specification表示java.lang.Object是所有没有任何超接口的接口的直接超类型。
答案 2 :(得分:1)
使用其界面引用对象时,例如
I ref = new B();
然后您只能访问界面和Object类方法。在将对象强制转换为类之前,您不具备类方法的可见性。
如果您想访问method
课程中声明的A
,那么您可以执行以下操作之一:
I ref = new B();
((A)ref).method()
或
A ref = new B();
ref.method();
或
B ref = new B();
ref.method();
答案 3 :(得分:0)
接口类型只能使用具体类来实例化,该类默认为Object的子类。因此,您可以在接口类型上调用Object中的方法。只有在接口或其超级接口中声明所有其他自定义方法时,才能在接口类型上调用所有其他自定义方法。
答案 4 :(得分:0)
如果通过界面引用对象,则只能访问界面公开的方法。
答案 5 :(得分:0)
ref.equals()
是允许的,因为equals()
是来自对象的方法,可用于所有子类(甚至B,因为B隐式扩展Object
)。
如果method()不在B中,则当您的语句为I i = new B()
时,您无法访问它。