我是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();
}
}
答案 0 :(得分:3)
您收到此错误,因为ClassA未实现接口B.
永远记住java中的父类型可以引用Subtype。
类型IntefaceB与此类型的类型无关。并为以下工作
InterfaceB obj = new ClassA();
ClassA需要将其父类型设置为InterfaceB(直接或通过实现InterfaceB(类)的任何其他类型或扩展InterfaceB(接口)。
答案 1 :(得分:1)
接口引用可以保存对象的引用,实现该接口。在您的情况下,您的classA没有实现interfac B,因此您收到错误:
InterfaceB obj = new ClassA();
在您的代码中的所有其他注释案例中。所使用的接口的引用实际上是一个类(子/父)的对象,它实现了该接口。
答案 2 :(得分:1)
接口包含类实现的行为。
在您的情况下,ClassA
未实现接口B.
InterfaceB obj = new ClassA(); //give error: incompatible types
要使该行有效,您可以使用 interfaceB
扩展您的界面A.interface InterfaceA extends InterfaceB
现在
InterfaceB obj = new ClassA(); //compiles
你正在反向做。其中InterfaceB
是InterfaceA
的父级。
答案 3 :(得分:1)
明确说明继承链:
1)InterfaceB是Interface A的孩子
2)A类是接口A的孩子
3)B类是接口B和A类(因此接口A)的子代
父变量(接口或类)类型可以包含子(类)实例。 除此之外的任何事情都会引发错误。