Java 为什么可以';在这种情况下,编译器是否为实例方法解析符号?
假设一个类MyClass实现了一个接口MyInterface,并且它有自己的实例方法,比如foo()。 当我创建MyClass的实例时,如下所示:Java 为什么可以';在这种情况下,编译器是否为实例方法解析符号?,java,interface,Java,Interface,假设一个类MyClass实现了一个接口MyInterface,并且它有自己的实例方法,比如foo()。 当我创建MyClass的实例时,如下所示: MyInterface myClass = new MyClass(); 编译器不允许我在没有显式强制转换的情况下访问其实例方法: myClass.foo(); // Can't resolve symbol ((MyClass) myClass).foo(); // this is okay 即使编译器显然知道myClass是myClass的
MyInterface myClass = new MyClass();
编译器不允许我在没有显式强制转换的情况下访问其实例方法:
myClass.foo(); // Can't resolve symbol
((MyClass) myClass).foo(); // this is okay
即使编译器显然知道myClass是myClass的实例:
if(myClass instanceof MyClass)
System.out.println(myClass.getClass().getName()); //this will print "MyClass"
为什么我需要使用cast for compiler来访问实例方法?它可能是
MyClass
类型,但您将其视为MyInterface
。当您执行A myVar=new B()时
您只能访问A
中可以访问的任何内容,即使myVar
属于B
类型,它可能属于MyClass
类型,但您将其视为MyInterface
。当您执行A myVar=new B()时
您只能访问A
中可以访问的任何内容,即使myVar
属于B
行MyInterface myClass=new myClass()
的含义是,创建一个新的MyClass
,然后忘记它的所有功能,界面MyInterface
中定义的功能除外
当你提到“编译器显然知道myClass是myClass的一个实例”时,你实际上并不正确:知道这一点的不是编译器,而是运行时。编译器被告知要忘记这些信息,它确实忘记了。行MyInterface myClass=new myClass()
的意思是创建一个新的MyClass
,然后忘记它的所有特性,界面MyInterface
中定义的特性除外
当您提到“编译器显然知道myClass是myClass的实例,“你实际上并不正确:知道这一点的不是编译器,而是运行时。编译器被告知忘记这些信息,它确实忘记了。因为您告诉编译器将
myClass
视为MyInterface
实例,所以它只能访问MyInterface
方法。编译器正在执行您要求它执行的操作。如果您想调用MyClass
方法(不强制转换),那么您将使用MyClass
类型的变量。这是否回答了您的问题?这表明了多态性。您可以根据变量声明的类型将MyClass的实例视为MyClass、My实例或对象,因为您告诉编译器将MyClass
视为MyInterface
实例,因此它只能访问MyInterface
方法。编译器正在执行您要求它执行的操作。如果您想调用MyClass
方法(不强制转换),那么您将使用MyClass
类型的变量。这是否回答了您的问题?这表明了多态性。根据变量声明的类型,可以将MyClass的实例视为MyClass、My实例或对象