4

请在下面找到解释该问题的代码片段。

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?

4

6 回答 6

7

那是因为您确实将其声明为 I:

I ref = new B();

您只会看到在 I 中声明的方法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 中的方法,并且要完整,您可以在它们之间转换您的对象。或者我也有一个工具。

于 2012-11-12T05:44:12.237 回答
2

Java 语言规范声明 java.lang.Object 是所有没有任何超接口的接口的直接超类型。

于 2012-11-12T05:50:39.077 回答
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();
于 2012-11-12T05:44:48.600 回答
0

接口类型只能使用具体类来实例化,具体类默认情况下是 Object 的子类。因此,您可以在接口类型上调用 Object 中的方法。仅当在该接口或其超接口中声明时,才能在接口类型上调用所有其他自定义方法。

于 2012-11-12T05:45:33.090 回答
0

如果通过接口引用对象,则只能访问接口公开的方法。

于 2012-11-12T05:45:48.533 回答
0

ref.equals()是允许的,因为equals()是来自对象的方法并且可用于所有子类(甚至 B 因为 B 隐式扩展Object)。

如果 method() 不在 B 中,则当您的语句为I i = new B().

于 2012-11-12T05:46:39.610 回答