我有这个
public interface ICool {
public boolean isCool();
}
现在我得到了这个层次结构:
public abstract class AbstractCoolness implements ICool{
private isCool;
@Override
public boolean isCool() {
return this.isCool;
}
}
和
public abstract class CoolPeople extends AbstractCoolness {
protected boolean isCool= true;
}
和
public abstract class UnCoolPeople extends AbstractCoolness {
protected boolean isCool= false;
}
现在我有很多继承自 UnCoolPeople
或 CoolPeople
的类。
当我用这个函数调用它们时:
if (person instanceof ICool ) {
if (person.isCool()) {
// do something
}
}
问题是,每当调用此 person.isCool()
时,它都会调用 abstractCoolness
类并返回 this.isCool
,这总是错误的.
知道为什么当我对从 CoolPeople
扩展的人使用此函数时我仍然得到 isCool() == false
吗?
最佳答案
非常简单。此代码将返回 isCool
的值:
public abstract class AbstractCoolness implements ICool{
private isCool;
@Override
public boolean isCool() {
return this.isCool;
}
}
而这段代码将简单地在子类中设置一个名为 isCool
的新变量,并隐藏在 AbstractCoolness
中找到的基成员。
public abstract class CoolPeople extends AbstractCoolness {
protected boolean isCool= true;
}
isCool()
方法将始终返回AbstractCoolness
中定义的isCool
变量,其他不会影响它。自 default value of a boolean为 false
,它永远不会返回 true
。
您可以通过在基类中创建一个采用 boolean 值 isCool
的构造函数并通过子类的构造函数传递它来绕过此问题。
解决方案的快速草图:
abstract class AbstractCoolness {
private isCool;
public AbstractCoolness(bool iscool){
isCool = iscool;
}
public boolean isCool() {
return this.isCool;
}
}
class CoolPerson extends AbstractCoolness {
public CoolPerson() {
super(true);
}
}
关于java - 动态调用——带有接口(interface)和抽象类的java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638561/