参考Interface创建对象

时间:2013-02-21 07:59:43

标签: java

引用变量可以声明为类类型或接口类型。如果变量声明为接口类型,它可以引用任何实现接口的类的任何对象。

基于上述陈述,我已经制定了一个理解代码。如上所述声明为接口类型,它可以引用任何实现接口的类的任何对象

但是我的代码在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");
    }
}

我确信我理解错误的方法。

有人可以解释同样的事情。

感谢回复。

6 个答案:

答案 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(),接口引用会给出一个错误。为此,您必须使用类引用。