如何在Java中实现接口方法

时间:2014-08-07 11:14:41

标签: java interface

编译以下代码时,编译器显示错误:

  

InterfaceTest.java:19:错误:找不到符号knightObj.dispBK();

public class InterfaceTest{
    public static interface Knight{
        public void embark();
    }
    public static class BraveKnight implements Knight{
        private int id;
        public BraveKnight(int id){
            this.id = id;
        }
        public void dispBK(){
            System.out.println("ID: "+id);
        }
        public void embark(){
            System.out.println("ID: "+id);
        }
    }
    public static void main(String[] args){
        Knight knightObj = new BraveKnight(101);
        knightObj.dispBK();
    }
}

可能的原因是什么?

5 个答案:

答案 0 :(得分:6)

Knight是您的界面,它没有定义名为dispBK()的方法。您的knightObj对象属于Knight类型,因此您需要将其转换为BraveKnight才能调用dispBK()方法。

或者,您可以将dispBK()方法添加到界面中。

您的第三个选择是初始化您的对象:BraveKnight knightObj = new BraveKnight(101);

我热烈推荐使用Eclipse之类的IDE,它们会像这样容易出错。

答案 1 :(得分:1)

将public void dispBK()添加到接口,然后就可以实现它了

答案 2 :(得分:1)

作为stated in the documentation

  

定义新界面时,您正在定义新的参考数据   类型。您可以在任何可以使用任何其他数据的地方使用接口名称   类型名称。如果定义类型为的引用变量   interface,您分配给它的任何对象都必须是类的实例   实现接口。

dispBK()是类的方法。 &安培; Knight是接口,方法未在界面中声明,因此您无法

添加:

public void dispBK();在您的界面中,然后就可以了。

如果仅在接口中声明了所有方法,则接口引用可以保存IMPL的对象。

或者你必须使用Impl对象访问该方法。

答案 3 :(得分:0)

来自子级的方法对父级不可见。这里knightObj是父接口Knight的一个实例,您试图调用其子视图的方法,该方法不可见。您应该将dispBK()方法添加到Kinght界面,或使用类似((BraveKnight)knightObj).dispBK();

的投射

答案 4 :(得分:0)

interfaace定义了具体类必须实现的最小方法集。这样你就知道如果你有一系列骑士物品(例如勇敢的夜晚 CowardlyKnight GoodKnight ),他们必须全部定义 embark()方法。

如果您将KnightObj变量定义为Knight界面,那么Knight的方法是直接可访问的唯一方法。

但是,您已将KnightObj实例化为新的BraveKinght(101),这意味着如果您使用

转换变量,仍然可以访问BraveKnight的其他方法
(BraveKnight)KnightObj.dispBK();

更详细的示例:

将参数传递给函数或在数组,集合(如

)中使用时
ArrayList<Knight> allKnight = new ArrayList<Knight>();
allKnight.add(new BraveKnight(105));
allKnight.add(new CowardlyKnight(13));
allKnight.add(new GoodKnight(88));

要测试您实际拥有的具体课程,请使用 instanceof 对其进行评估,即

for (Knight eachKnight : allKnight) {
    // No need to cast this, as all Knightly objects must implement it.
    eachKnight.embark();

    if (eachKnight instanceof BraveKnight) {
         (BraveKnight)eachKnight.dispBK();
    } else if (eachKnight instanceof CowardlyKnight) {
         (CowardlyKnight)eachKnight.runaway();
    } // no test for GoodKnight - he's always good
}