Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我是否使用接口中未定义的方法?_Java_Interface_Polymorphism - Fatal编程技术网

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是Interface
IHello
的实现,则应将其设置为

public class A implements IHello{
    ...
}

请注意,如果将实例变量x声明为XXX类型,则只有类XXX中的方法对实例x可见。在您的例子中,您将b声明为IHello,实例b只能访问方法hello(),它不能访问
printHello()
,只有声明为
b
的实例才能调用
printHello()
,如果您100%确定b是b的实例,您可以将实例b强制转换为类型b。

变量的类型是什么(不是对象)?这是编译器看到的。顺便说一句,这里已经问了无数次了。变量的类型是IHello,但是由于它被分配给了a
B
,我试图理解为什么我不能使用
B
的方法。编译器没有查看实际的对象类型。它正在查看您声明的类型-IHello。在某些情况下,编译器可能不知道实际的对象类型,因为这可能仅在运行时可用。感谢您的回答,但即使进行了更改,我仍然会收到相同的错误。@OmarN请参阅我的最后一句话