Java继承方法覆盖实例变量

时间:2013-06-03 13:20:21

标签: java inheritance

我正面临着一种我不理解的奇怪行为。 实际上我有一个DAO AbstractFacade,其中我注入了一个EntityManager。从这个抽象类我衍生出许多子类。 首先,该项目没有正常工作,导致许多例外。然后我从错误消息中注意到我在使EntityManager执行持久性作业时遇到了问题。这很奇怪,因为我在抽象类中得到了一个返回

的getter
entityManager.
public class AbstractFacade<T> {
    private EntityManager em;
    private Class<T> entityClass;

    protected EntityManager getEntityManager() {
        return em;
    }

    public AbstractFacade(Class entityClass){
        this.entityClass = entityClass;
    }

所以我想知道为什么它在子类中工作?我有一个想法,以覆盖解决问题的方法,没有更多的例外!

@Stateless
@LocalBean
public class AirportFacade extends AbstractFacade<Airport> implements AirportFacadeLocal{
    @PersistenceContext(unitName = "flams_pu")
    private EntityManager em;

    public AirportFacade(){
        super(Airport.class);
    }

    @Override
    public EntityManager getEntityManager(){
        return em;
    }

到目前为止很好但是我并不满足,因为我无法弄清楚为什么它在重写吸气剂之前没有工作?

所以,如果有人知道原因,请让我知道并非常感谢。

2 个答案:

答案 0 :(得分:3)

您无法覆盖实例变量。如果你在子类中重新声明它,那么 shadow 原始变量和新变量,但两者仍然存在。

在第一种情况下,返回了AbstractFacade#em变量,因为这是getEntityManager()方法所在的位置。

只要您使用override方法的getEntityManager(),就会返回AirportFacade#em变量。

答案 1 :(得分:0)

这是解决您问题的可能方法之一。您不能覆盖字段,但PersistenceContext注释也适用于setter。下面的解决方案让你在子类中使用不同的上下文。

public class AbstractFacade<T> {

    protected EntityManager em;

    private Class<T> entityClass;

    protected EntityManager getEntityManager() {
        return em;
    }

    public AbstractFacade(Class entityClass){
        this.entityClass = entityClass;
    }
}

@Stateless
@LocalBean
public class AirportFacade extends AbstractFacade<Airport> implements AirportFacadeLocal{

    public AirportFacade(){
        super(Airport.class);
    }

    @PersistenceContext(unitName = "flams_pu")
    protected void setEntityManager(EntityManager em) {
         this.em = em;
    }
}