重写实例变量的Java继承方法

重写实例变量的Java继承方法,java,inheritance,Java,Inheritance,我面临着一种我不理解的奇怪行为。 事实上,我有一个DAO抽象外观,在其中我注入了一个EntityManager。我从这个抽象类派生了许多子类。 首先,这个项目没有正常运作,导致了许多例外。然后,我从错误消息中注意到,我在让EntityManager执行持久性工作时遇到了问题。这很奇怪,因为我在抽象类中得到了一个getter,它返回 entityManager. public class AbstractFacade<T> { private EntityManager em;

我面临着一种我不理解的奇怪行为。 事实上,我有一个DAO抽象外观,在其中我注入了一个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;
    }
entityManager。
公共类抽象外观{
私人实体管理者;
私有类实体类;
受保护的EntityManager getEntityManager(){
返回em;
}
公共抽象外观(类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;
    }
@无状态
@本地豆
公共类AirportFacade扩展了AbstractFacade,实现了AirportFacadeLocal{
@PersistenceContext(unitName=“flams_pu”)
私人实体管理者;
公共机场门面(){
超级(机场级);
}
@凌驾
公共实体管理器getEntityManager(){
返回em;
}
到目前为止还不错,但我并不满意,因为我不明白为什么它在覆盖getter之前不起作用


因此,如果有人知道原因,请告诉我,非常感谢。

您不能重写实例变量。如果在子类中重新声明它,您将使用新变量来隐藏原始变量,但两者仍然存在

在第一种情况下,返回了
AbstractFacade#em
变量,因为
getEntityManager()
方法就位于此


一旦您对
getEntityManager()
方法执行了
override
,就会返回
AirportFacade#em
变量。

您无法重写实例变量。如果在子类中重新声明它,则会使用新变量对原始变量进行阴影处理,但两者仍然存在

在第一种情况下,返回了
AbstractFacade#em
变量,因为
getEntityManager()
方法就位于此


一旦执行了
getEntityManager()的
重写
方法,则返回了
AirportFacade#em
变量。

这是解决问题的可能方法之一。您不能重写字段,但
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;
    }
}
公共类抽象外观{
受保护的实体管理器em;
私有类实体类;
受保护的EntityManager getEntityManager(){
返回em;
}
公共抽象外观(类entityClass){
this.entityClass=entityClass;
}
}
@无国籍
@本地豆
公共类AirportFacade扩展了AbstractFacade,实现了AirportFacadeLocal{
公共机场门面(){
超级(机场级);
}
@PersistenceContext(unitName=“flams_pu”)
受保护的无效设置EntityManager(EntityManager em){
this.em=em;
}
}

这是您的问题的可能解决方案之一。您不能重写字段,但是
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;
    }
}
公共类抽象外观{
受保护的实体管理器em;
私有类实体类;
受保护的EntityManager getEntityManager(){
返回em;
}
公共抽象外观(类entityClass){
this.entityClass=entityClass;
}
}
@无国籍
@本地豆
公共类AirportFacade扩展了AbstractFacade,实现了AirportFacadeLocal{
公共机场门面(){
超级(机场级);
}
@PersistenceContext(unitName=“flams_pu”)
受保护的无效设置EntityManager(EntityManager em){
this.em=em;
}
}

你不重写,你只是影子。简单地说,你不能。:)重写仅用于方法。继承和重写的概念不同于实例和类变量和methods@velocity:你的entitymanager在你的类中是私有的,那么你怎么可以在没有getter的情况下访问它呢?你不重写它,你可以简单地使用shadowwords.You cannot.:)重写仅用于方法。继承和重写的概念与实例和类varibales和methods@velocity:你的entitymanager在你的课堂上是私有的,那么你怎么可以不使用getter就访问它呢?谢谢你的回答,尽管我认为你误解了我的问题,因为我已经理解了知道重写只适用于方法,但问题是,为什么在重写getEntityManager方法之前,我无法获得注入的entityManager实例(em)来自AirportFacade,因为它继承了AbstractFacade的getEntityManager方法?@velocity:好。特别是问题标题和您提供的信息表明您在重写实例变量方面存在问题。如果不是这样,您需要重新表述您的问题,或者如果问题完全是一个问题,您可能需要问一个新问题不同的问题。@velocity:在问题的开头,您似乎表示您的第一个版本中也有实体管理器,但它工作不正常。在这种情况下,这与继承和重写无关。感谢您的回答,尽管我认为您误解了我的问题,因为我已经知道了iding只适用于方法,但问题是为什么在重写getEntityManager方法之前,我无法获取注入的entityManager实例(em)来自AirportFacade,因为它继承了AbstractFacade的getEntityManager方法?@velocity:Ok。特别是问题标题和您提供的信息表明您在重写实例变量方面有问题。如果没有