我陷入一个问题。
我的问题是这样的。
我有一个超类Animal和两个子类Human和Bird。
我的超类Animal中有一个fly方法,它将基于Flyable Interface为Human和Bird类提供一个实现。
我的动物类看起来像这样。
public class`Animal{
public Flyable flyable;
public void fly()
{
flyable.fly();
}
}
人类阶级看起来像这样
class Human extends Animal {
Flyable flyable;
public Human()
{
flyable = new CantFly();
}
}
鸟班看起来像这样
class Bird extends Animal {
Flyable flyable;
public Bird()
{
flyable = new FlyHigh();
}
}
接口如下
public interface Flyable {
public void fly();
}
public class CantFly implements Flyable{
@Override
public void fly()
{
Sysout("cant fly");
}
当我打电话
Animal me = new Human();
me.fly();
它给了我NullPointerException
我在这里想念的是什么?
我当时在假设。由于我正在调用new Human(),因此它将在超类Animal中初始化Flyable接口。我错了吗?
我已经通过更改方法的设计解决了这个问题。
fly(Flyable flyable)。因此,我不需要那种设计解决方案。
我记得当我为应用程序实现搜索算法时会遇到此问题,该算法将提供结果列表,但列表项将具有不同的结果
用户界面,
https调用不同的结束URL,
解析JSON,
映射到不同的POJO类。
可悲的是,我不得不用我提到的另一种方法来解决这个问题。
最佳答案
Human
继承自Animal
,因此其所有字段均从Animal
隐式“复制”。因此,您无需在flyable
和Human
中再次重新声明Bird
。
但是你做到了。这将导致子类中新的flyable
字段隐藏Animal
中声明的原始字段。结果,当您这样做时:
flyable = new CantFly();
在
Human
中,您要为flyable
中的Human
而不是flyable
中的Animal
分配值。然后您这样做:
Animal me = new Human();
me.fly();
fly
中的Animal
使用在flyable
类中声明的字段Animal
,该字段尚未分配(您仅在flyable
中分配了Human
)!结果发生了NPE。要解决此问题,只需删除
flyable
子类中的所有Animal
字段。这样,只有一个flyable
字段。注意
我认为这种设计有些奇怪。
Human
不能飞行,因此它实际上不应具有flyable
字段。实际上,没有任何内容应具有flyable
字段。在这3个类中,只有Bird
应该实现Flyable
。关于java - Java接口(interface)设计模式情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45648691/