0

我是java新手,在尝试一些what is the output问题时我发现了。

此行InterfaceB obj = new ClassA();给出错误,而其他行则没有。

我知道超类变量可以引用与接口相同的子类变量。但是在那种情况下会发生什么。我想知道看到的背后发生了什么。

interface InterfaceA { void methodA(); }

interface InterfaceB extends InterfaceA { void methodB(); }

class ClassA implements InterfaceA
{
     public void methodA() {}
     public void methodB() {}
}

class ClassB extends ClassA implements InterfaceB
{
     public ClassB() {}
     // InterfaceA obj = new ClassA(); no error 
     InterfaceB obj = new ClassA(); //give  error: incompatible types
     // InterfaceA obj = new ClassB(); no error
     // InterfaceB obj = new ClassB(); no error
      // ClassA obj = new ClassB(); no error
}

public class Online4 {
    public static void main(String args[]) {
        ClassB b = new ClassB();
    }
}
4

4 回答 4

3

您收到此错误是因为 ClassA 未实现接口 B。

永远记住,java 中的父类型可以引用子类型。

在这里,类型 IntefaceB 与类型 ClassA 没有任何关系。为了下面的工作

InterfaceB obj = new ClassA(); 

ClassA 需要将其父类型设为 InterfaceB(直接或通过实现 InterfaceB(类)或扩展 InterfaceB(接口)的任何其他类型。

于 2013-07-13T09:52:38.457 回答
1

接口引用可以保存对对象的引用,实现该接口。在您的情况下,您的 classA 没有实现接口 B,因此您在以下位置收到错误:

InterfaceB obj = new ClassA(); 

在您的代码中的所有其他注释案例中。所用接口的引用实际上是持有实现该接口的类(子/父)的对象。

于 2013-07-13T09:55:19.047 回答
1

接口包含类实现的行为。

在您的情况下ClassA,不实现接口 B。

 InterfaceB obj = new ClassA(); //give  error: incompatible types

要使该行正常工作,您可以使用 interfaceB 扩展您的interfaceA

interface InterfaceA  extends InterfaceB 

现在

   InterfaceB obj = new ClassA(); //compiles

你正在做相反的事情。InterfaceB的父级在哪里InterfaceA

于 2013-07-13T09:58:08.230 回答
1

要清楚地说明继承链:

1) InterfaceB 是 Interface A 的子接口

2) 类 A 是接口 A 的子类

3) B 类是接口 B 和 A 类的子类(因此是接口 A)

父变量(接口或类)类型可以保存子(类)实例。超出此范围的任何内容都会引发错误。

于 2013-07-13T09:59:14.697 回答