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

Java 通过接口引用访问实现的类方法,而无需构造函数初始化,java,Java,我有一个类CommonDaoImpl,它实现了一个接口CommonDao。现在我正试图通过接口CommonDaoImpl访问getRegisterData(),如下所示 public class CommonServiceImpl implements CommonService { CommonDao commonDao public boolean insertRegisterData(CommonBean objCommonBean) { return

我有一个类
CommonDaoImpl
,它实现了一个接口
CommonDao
。现在我正试图通过接口
CommonDaoImpl
访问
getRegisterData()
,如下所示

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

    public boolean getRegisterData(CommonBean objCommonBean)  {
        return commonDao.insertRegisterData(objCommonBean);
    }
但它不起作用,并且存在NullPointerException

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

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

    public boolean getRegisterData(CommonBean objCommonBean)  {
        return commonDao.insertRegisterData(objCommonBean);
    }
但我不明白为什么会这样。

在第一种情况下

CommonDao commonDao
它是类的成员字段,未初始化,具有默认值
null
,因此在
null
上调用方法会导致
NullPointerException

在第二种情况下,您正在初始化它

CommonDao commonDao=new CommonDaoImpl();
在第一种情况下

CommonDao commonDao
它是类的成员字段,未初始化,具有默认值
null
,因此在
null
上调用方法会导致
NullPointerException

在第二种情况下,您正在初始化它

CommonDao commonDao=new CommonDaoImpl();

为什么会发生什么?NullPointerException?这是因为一旦实例化了CommonServiceImpl,所有字段都会收到默认值。commonDao是默认值为空的字段

为什么会发生什么?NullPointerException?这是因为一旦实例化了CommonServiceImpl,所有字段都会收到默认值。commonDao是默认值为空的字段

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

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

第一个commonDao是对实现的类的引用

Sicne commonDao是一个接口,它不实现任何方法

CommonDao CommonDao

commonDao不引用实现接口的初始化对象,因此当调用commonDao.insertRegisterData(objCommonBean)时;comonDao为Null,因为当前没有为其分配内存地址,并且它会引发Null异常(参见图表)

CommonDao CommonDao=新的CommonDaoImpl();<--这个在这里初始化

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


第一个commonDao是实现类的引用

Sicne commonDao是一个接口,它不实现任何方法

CommonDao CommonDao

commonDao不引用实现接口的初始化对象,因此当调用commonDao.insertRegisterData(objCommonBean)时;comonDao为Null,因为当前没有为其分配内存地址,并且它会引发Null异常(参见图表)

CommonDao CommonDao=新的CommonDaoImpl();<--这个在这里初始化

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