Java 为什么可以';我是否使用接口中未定义的方法?
我有一个接口和三个类。在类Java 为什么可以';我是否使用接口中未定义的方法?,java,interface,polymorphism,Java,Interface,Polymorphism,我有一个接口和三个类。在类B中,我定义了一个名为printHello的方法。然后,在类Test中,我声明了一个新的IHello对象,并将其分配给一个新的B 问题是,代码没有编译,因为我得到一个错误,指示“类型IHello的方法printHello()未定义”。这让我感到困惑,因为我能够将类型为IHello的对象分配给新的B,所以即使接口没有B的方法,该对象也不能使用它们吗 为了解决这个问题,我知道我可以在IHello接口中声明一个名为printHello的方法,也可以声明类型B的对象。我还能做些
B
中,我定义了一个名为printHello
的方法。然后,在类Test
中,我声明了一个新的IHello
对象,并将其分配给一个新的B
问题是,代码没有编译,因为我得到一个错误,指示“类型IHello的方法printHello()未定义”。这让我感到困惑,因为我能够将类型为IHello
的对象分配给新的B
,所以即使接口没有B
的方法,该对象也不能使用它们吗
为了解决这个问题,我知道我可以在IHello
接口中声明一个名为printHello
的方法,也可以声明类型B的对象。我还能做些什么来解决这个问题吗
接口IHello
public interface IHello {
void hello();
}
甲级
public class A implements IHello{
public void hello(){
System.out.println("hello");
}
}
B类
public class B extends A {
public void printHello(){
this.hello();
}
}
课堂测试
public class Test {
public static IHello b;
public static void main(String[] args) {
b = new B();
b.printHello(); //The method printHello() is undefined for type IHello
}
}
类B扩展了类A,并且您的类A或B都与接口IHello没有关系,因此您无法实例化B并将其分配给
B
,因为B
的类型是IHello
如果您的类A是InterfaceIHello
的实现,则应将其设置为
public class A implements IHello{
...
}
请注意,如果将实例变量x声明为XXX类型,则只有类XXX中的方法对实例x可见。在您的例子中,您将b声明为IHello,实例b只能访问方法hello(),它不能访问
printHello()
,只有声明为b
的实例才能调用printHello()
,如果您100%确定b是b的实例,您可以将实例b强制转换为类型b。变量的类型是什么(不是对象)?这是编译器看到的。顺便说一句,这里已经问了无数次了。变量的类型是IHello,但是由于它被分配给了aB
,我试图理解为什么我不能使用B
的方法。编译器没有查看实际的对象类型。它正在查看您声明的类型-IHello。在某些情况下,编译器可能不知道实际的对象类型,因为这可能仅在运行时可用。感谢您的回答,但即使进行了更改,我仍然会收到相同的错误。@OmarN请参阅我的最后一句话