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有一个分配给它的地址,它是一个初始化类。所以现在有一个现有的对象要引用,它有这个方法