我有这个
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
的任何想法?
答案 0 :(得分:2)
这很简单。此代码将返回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
变量,另一个不会影响它。由于default value of a boolean为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);
}
}
答案 1 :(得分:1)
您不能“覆盖”会员价值。
在您的代码中,AbstractCoolness.isCool()
会返回其私人成员isCool
的值,默认设置为false
。
您可以在构造函数中设置isCool
,也可以在不同的具体类中覆盖isCool()
方法以返回预期值。
答案 2 :(得分:1)
我猜AbstractCoolness
确实是
public abstract class AbstractCoolness implements ICool {
private isCool;
@Override
public boolean isCool() { // Not isShared
return this.isCool;
}
}
在这种情况下,isCool()
会返回private
变量isCool
的内容,该变量已初始化为false
。如果它是protected
而没有被子类隐藏(重新声明),它将按预期工作:
AbstractCoolness implements ICool {
protected boolean cool;
public boolean isCool() { return cool; }
}
CoolPerson extends AbstractCoolness {
public CoolPerson() { cool = true; }
}