请问这个接口是如何直接调用接口中的方法的?没有找到将接口实现为类实例的代码

RiceMelon 2014-12-07 12:30:57

有一个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();这样的实现代码。
//一个接口如果没有给它赋值为实现类的实例,是怎么直接调用接口方法的?

}
...全文
1188 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuemove123 2017-03-10
  • 打赏
  • 举报
回复
直接调用接口中的方法,其实是这样的,我的项目就是这么做的。 首先,要在当前类中写一个构造方法(以我的项目为例): 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();
highnewrain 2014-12-09
  • 打赏
  • 举报
回复
引用 5 楼 rice1985 的回复:
[quote=引用 1 楼 u010005508 的回复:] 就算这个private PieChartDataProvider dataProvider; 真的没有用一个它的实现类进行初始化,你也是可以调用这个接口的方法的啊,编译的时候是不会有问题的!只不过这个变量为null,在运行的时候会抛异常而已! 你在调用这个接口方法的地方设个断点调试一下呗,若其值不为null,则肯定有其它地方赋值或初始化了(利用Spring之类的)!
那么如果没有在显性的代码里面初始化,有没有办法把它被初始化的地方找出来?[/quote] 如果用的是spring,你找找相关的.xml配置文件!如果不是,用编译器的查找引用功能啊!实在找不到,最简单的就是调试下,看其值是不是null就好了
wang_BobFirst 2014-12-07
  • 打赏
  • 举报
回复
spring 注入?
highnewrain 2014-12-07
  • 打赏
  • 举报
回复
就算这个private PieChartDataProvider dataProvider; 真的没有用一个它的实现类进行初始化,你也是可以调用这个接口的方法的啊,编译的时候是不会有问题的!只不过这个变量为null,在运行的时候会抛异常而已! 你在调用这个接口方法的地方设个断点调试一下呗,若其值不为null,则肯定有其它地方赋值或初始化了(利用Spring之类的)!
JPF1024 2014-12-07
  • 打赏
  • 举报
回复


interface Person {
    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,不知道是否重现了你的问题,只是接口是可以调用的,但是运行报空指针.
wyc_ 2014-12-07
  • 打赏
  • 举报
回复
接口调用方法一点问题都没有。再找一下肯定有地方为dataProvider赋值的,或者看一下父类中有没有public的 dataProvider。
RiceMelon 2014-12-07
  • 打赏
  • 举报
回复
引用 1 楼 u010005508 的回复:
就算这个private PieChartDataProvider dataProvider; 真的没有用一个它的实现类进行初始化,你也是可以调用这个接口的方法的啊,编译的时候是不会有问题的!只不过这个变量为null,在运行的时候会抛异常而已! 你在调用这个接口方法的地方设个断点调试一下呗,若其值不为null,则肯定有其它地方赋值或初始化了(利用Spring之类的)!
那么如果没有在显性的代码里面初始化,有没有办法把它被初始化的地方找出来?
RiceMelon 2014-12-07
  • 打赏
  • 举报
回复
引用 2 楼 wang_BobFirst 的回复:
spring 注入?
这是一个android项目,也能用spring注入吗?用ctrl+H查询了一下也没有看到对于这个接口有什么映射的配置
风一样的逗B 2014-12-07
  • 打赏
  • 举报
回复
如果该对象未注入,那么运行时,如果未实例化就会抛运行时异常,编译能顺利通过

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧