有一个PieChartDataProvider接口,定义如下
public interface PieChartDataProvider { public PieChartData getPieChartData();
.......
}有一个实现这个接口的类PieChartView,里面覆写了接口的getPieChartData()方法public class PieChartView extends AbstractChartView implements PieChartDataProvider {
....... @Override
public PieChartData getPieChartData() {
return data;
} .......
}
在另一个类中,
public class PieChartRenderer extends AbstractChartRenderer {private PieChartDataProvider dataProvider; //定义接口dataProvider;
.........;...final PieChartData data = dataProvider.getPieChartData(); //为什么接口可以直接调用类?
//我找遍了整个项目,都没有类似PieChartDataProvider dataProvider = new PieChartView();这样的实现代码。
//一个接口如果没有给它赋值为实现类的实例,是怎么直接调用接口方法的?}
你在调用这个接口方法的地方设个断点调试一下呗,若其值不为null,则肯定有其它地方赋值或初始化了(利用Spring之类的)!
这是一个android项目,也能用spring注入吗?用ctrl+H查询了一下也没有看到对于这个接口有什么映射的配置
String getName();
}class A implements Person{
@Override
public String getName(){
return "1";
}
}class B implements Person{ @Override
public String getName() {
return "1";
}
}class C{
private static Person p ; public static String get(){
return getPs().getName();
} private static Person getPs() {
return p;
}
}
public class Main { public static void main(String[] args) {
System.out.println(C.get());
}
}名字为Main.java,不知道是否重现了你的问题,只是接口是可以调用的,但是运行报空指针.
那么如果没有在显性的代码里面初始化,有没有办法把它被初始化的地方找出来?
如果用的是spring,你找找相关的.xml配置文件!如果不是,用编译器的查找引用功能啊!实在找不到,最简单的就是调试下,看其值是不是null就好了
首先,要在当前类中写一个构造方法(以我的项目为例):
private LessonsService lessonBiz=null;
public AdminLessonAction(){
lessonBiz=AbstractServiceFactory.newInstance(SystemConfig.ServiceFactoryType).createLessonsService();
}//构造方法
这里,先前要定义一个类AbstractServiceFactory:public abstract class AbstractServiceFactory
{
public static AbstractServiceFactory newInstance(String type){
AbstractServiceFactory fac=null;
try
{
fac=(AbstractServiceFactory)Class.forName(type).newInstance();
}
catch (Exception e){}
return fac;
}
要定义一个类SystemConfig:
public class SystemConfig
{//此类中只有属性。
public static String ServiceFactoryType;
}
关键是下一步:
属性ServiceFactoryType,其实是servlet的param-name,可以在web.xml中找到。代码帖上:
<context-param>
<param-name>ServiceFactoryType</param-name>
<param-value>com.factory.ServiceFactory</param-value>
</context-param>
下面就是要在com.factory.ServiceFactory类中写方法,代码如下:
public class ServiceFactory extends AbstractServiceFactory
{ @Override
public FailService createFailService()
{
return new FailServiceImpl();
}}
看到了吗?实现接口的类,是在这里呢!!! return new FailServiceImpl();