通过接口引用访问实现的类方法,无需构造函数初始化

时间:2012-07-02 14:27:30

标签: java

我有一个实现接口CommonDaoImpl的类CommonDao。现在,我正尝试通过getRegisterData()接口访问CommonDaoImpl CommonDao这样的参考

public class CommonServiceImpl implements CommonService 
{
    CommonDao commonDao
    public boolean insertRegisterData(CommonBean objCommonBean)  {
        return commonDao.getRegisterData(objCommonBean);
    }

但它不起作用并且发生了NullPointerException

所以我稍微改变了我的代码并使用实现类CommonDao impl的构造函数初始化接口引用,如下所示

public class CommonServiceImpl implements CommonService 
{
    CommonDao commonDao=new CommonDaoImpl();

    public boolean getRegisterData(CommonBean objCommonBean)  {
        return commonDao.insertRegisterData(objCommonBean);
    }

但我无法理解为什么会这样。

4 个答案:

答案 0 :(得分:3)

在第一种情况下

CommonDao commonDao

它是您的类的成员字段,未初始化且默认值为null,因此null上的调用方法会导致NullPointerException

在你的第二个案例中,你正在初始化它

CommonDao commonDao=new CommonDaoImpl();

答案 1 :(得分:1)

为什么会发生什么?空指针异常?它发生了,因为一旦您实例化CommonServiceImpl,所有字段都会收到默认值。 commonDao是一个默认值为null的字段。

答案 2 :(得分:0)

这是因为您需要CommonDao的实例来调用insertRegisterData方法。语句commonDao=new CommonDaoImpl()创建一个调用构造函数的实例并将其分配给commonDao,因此它不再是null

答案 3 :(得分:0)

第一个commonDao是参考已实施的类

Sicne commonDao是一个界面,它没有实现任何方法

  

CommonDao commonDao

commonDao没有引用实现接口的初始化对象,所以当你调用commonDao.insertRegisterData(objCommonBean)时; comonDao为Null,因为当前没有为它分配内存地址,并且它抛出NullException(参见图表)

  

CommonDao commonDao = new CommonDaoImpl(); < ---这在这里初始化

现在,commonDao正在引用一个实现接口的初始化对象。所以当你调用commonDao.insertRegisterData(objCommonBean)时,comonDao接口。 commonDao有一个分配给它的地址,这是一个初始化的类。所以现在有一个现有的参考对象有该方法。

enter image description here