我有这个

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类并返回始终为false的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()将始终返回在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);
   }
}

09-25 22:24