[英]Dynamic invocation - java with interface and abstract class
我有这个
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
,它始终为false。
任何想法,为什么当我在从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()
将总是返回isCool
中定义的变量AbstractCoolness
,其它不会影响它。 由于布尔值的默认值为 false
,因此它将永远不会返回true
。
您可以通过在基类中创建一个构造函数来绕过此过程,该构造函数采用布尔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);
}
}
您不能“覆盖”成员值。
在您的代码中, AbstractCoolness.isCool()
返回其私有成员isCool
的值,默认情况下将其设置为false
。
您可以在构造函数中设置isCool
,也可以在不同的具体类中覆盖isCool()
方法以返回期望值。
我想AbstractCoolness
是真的
public abstract class AbstractCoolness implements ICool {
private isCool;
@Override
public boolean isCool() { // Not isShared
return this.isCool;
}
}
在这种情况下, isCool()
返回private
变量isCool
的内容,该变量初始化为false
。 如果它protected
子类的protected
并且未被隐藏(声明),它将按预期工作:
AbstractCoolness implements ICool {
protected boolean cool;
public boolean isCool() { return cool; }
}
CoolPerson extends AbstractCoolness {
public CoolPerson() { cool = true; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.