动态调用 - 带接口和抽象类的java

时间:2013-12-17 15:47:30

标签: java dynamic polymorphism

我有这个

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;
}    

现在我有很多继承自UnCoolPeopleCoolPeople的课程。

当我用这个函数调用它们时:

if (person instanceof ICool ) {     
     if (person.isCool()) {
         // do something
     }
}

问题是,只要调用此person.isCool(),它就会调用abstractCoolness类并返回this.isCool,这总是错误的。

为什么当我在CoolPeople延伸的人使用此功能时仍然会得到isCool() == false的任何想法?

3 个答案:

答案 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 booleanfalse,因此永远不会返回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; }
}