编译以下代码时,编译器显示错误:
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();
}
}
可能的原因是什么?
答案 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
}