繁体   English   中英

动态调用-具有接口和抽象类的Java

[英]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;
}    

现在,我有很多从UnCoolPeopleCoolPeople继承的类。

当我使用此功能调用它们时:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM