引用变量可以声明为类类型或接口类型。如果变量声明为接口类型,它可以引用任何实现接口的类的任何对象。
基于上述陈述,我已经制定了一个理解代码。如上所述声明为接口类型,它可以引用任何实现接口的类的任何对象。
但是我的代码在objParent.displayName();中显示未定义的displayName()方法。
public class OverridenClass
{
public static void main(String[] args)
{
Pritable objParent = new Parent();
objParent.sysout();
objParent.displayName();
}
}
interface Pritable
{
void sysout();
}
class Parent implements Pritable
{
public void displayName()
{
System.out.println("This is Parent Name");
}
public void sysout()
{
System.out.println("I am Printable Interfacein Parent Class");
}
}
我确信我理解错误的方法。
有人可以解释同样的事情。
感谢回复。
答案 0 :(得分:5)
但在我的代码中显示displayName()方法未定义。
是的,因为displayName
界面中未定义Pritable
。您只能通过声明为具有该接口的变量访问接口上定义的方法,即使具体类具有其他方法也是如此。这就是为什么你可以拨打sysout
,而不是displayName
。
如果您考虑这样的示例,原因就更明显了:
class Bar {
public static void foo(Pritable p) {
p.sysout();
p.displayName();
}
}
class Test {
public static final void main(String[] args) {
Bar.foo(new Parent());
}
}
foo
中的代码必须依赖于除Pritable
接口之外的任何内容,因为我们在编译时不知道具体的类是什么可能是。
接口的要点是仅使用接口引用定义代码可用的特性,而不考虑使用的具体类。
答案 1 :(得分:2)
您需要输入强制转换才能访问Parent
方法
((Parent)objParent).displayName();
答案 2 :(得分:1)
编译器不关心运行时。就编译器而言,它会检查引用类型是否在接口类型中有一个名为display的方法。
在您的子类或实现类中声明的方法不是其中的一部分 您的超类/界面。因此你无法调用这些方法 在具有超类/接口引用的子类中声明 类型。
答案 3 :(得分:1)
displayName()
方法显示为未定义,因为objParent
声明为类型Pritable
且接口没有此类方法。为了能够使用方法displayName()
,您可以在界面Pritable
中声明它:
interface Pritable
{
void sysout();
void displayName();
}
在调用方法objParent
之前,首先将Parent
转换为displayName()
:
Pritable objParent = new Parent();
objParent = (Parent)objParent;
objParent.displayName();
答案 4 :(得分:0)
接口基本上是另一种方式 - 破坏单继承规则。
通过使用接口,子类可以继承它的父方法,并被迫实现它的接口方法。导致易于扩展和维护继承树等。
然而,捕获的是,当在父项下引用子项时,您只能访问父方法。要访问接口方法,您需要在接口引用类型下强制转换或创建子类。
接口还允许在接口类型下收集多个不同族的类的集合。为了我还没有发现什么好处。
在我看来,这是毫无意义的,因为我仍然无法实现完全成熟的多态性 - 只需使用父引用类型并仍然可以访问接口实现。
答案 5 :(得分:0)
该接口的方法签名驻留引用的任何位置都不会给出任何错误。在您的示例中,您的方法sysout()在接口中,因此该接口的引用不会给出任何错误,但是对于方法displayName(),接口引用会给出一个错误。为此,您必须使用类引用。