为什么我不能使用未在接口中定义的方法?

时间:2017-05-31 21:25:11

标签: java interface polymorphism

我有一个界面和三个类。在课程B中,我定义了一个名为printHello的方法。然后,在课程Test中,我声明一个新的IHello对象并将其分配给新的B.

问题是,代码无法编译,因为我收到一条错误,指出“类型IHello的方法printHello()未定义”。这让我感到困惑,因为我能够将IHello类型的对象分配给新的B,所以即使该对象也不能使用B的方法,界面没有它们?

要解决这个问题,我知道我可以在printHello接口中声明一个名为IHello的方法,或者我可以声明类型B的对象。我还能做些什么来解决这个问题吗?

接口IHello

public interface IHello {

    void hello();

}

A类

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
    }
}

1 个答案:

答案 0 :(得分:2)

B类扩展了A类,您的A类或B类都没有与Interface IHello的关系,因此您无法实例化B并将其分配给b,因为b的类型为{{1} }}

如果您的A类是接口IHello的实现,则应将其设为

IHello

请注意,如果将实例变量x声明为XXX类型,则只有类XXX中的方法对实例x可见。在您的情况下,您将b声明为IHello,实例b只能访问方法hello(),它无法访问public class A implements IHello{ ... } ,只有声明为printHello()的实例才能调用B,如果您是100%确定b是B的实例,您可以将实例b转换为B类型。