是Object层次结构的接口部分吗?

时间:2012-11-12 05:41:11

标签: java object interface extends implements

请在下方找到解释问题的代码段。

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?

6 个答案:

答案 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()时,您无法访问它。