У меня есть этотДинамический вызов - Java с интерфейсом и абстрактным классом
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
который alwayes ложь.
Любые идеи, почему, когда я использую эту функцию для человека, который простирается от CoolPeople
, я все еще получаю isCool() == false
?
полиморфизма не относится к переменным экземпляра. –
is_shared;) да спасибо, что вы имеете в виду, не применимо к переменным экземпляра? – Urbanleg
Если вы объявляете поле в подтире, имеющем то же имя, что и поле в супертипе, вы скрываете поле супер-типа. Доступ к полям разрешен в зависимости от типа ссылки, к которой осуществляется доступ к полю. –