为了账号安全,请及时绑定邮箱和手机立即绑定

实例化没有实现类的接口

实例化没有实现类的接口

呼如林 2022-01-12 10:00:52
我有一个接口(称为 Planet),其实现类受保护,我无法更改访问修饰符。但是,我需要在我的主类中调用实现类的方法。例如,在实现类中,我有:public void orbit() {distance++;} 我试过了:private Planet planet = new PlanetImpl,但是由于 PlanetImpl 类是受保护的,并且在不同的包中,所以找不到它,使语句无效。我也尝试过将其保留为空,就像这样, Planet planet; planet.orbit();但它会引发 NullPointerException。是否可以在不直接引用实现类的情况下调用方法?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

使用匿名内部类我们可以做到。匿名类可以实现接口,我认为那时只有你有机会看到一个类实现了没有“implements”关键字的接口。


interface Planet  {

public void orbit();

}

class PlanetMain  {

private Planet p = new Planet () {

    public void orbit() {

        System.out.println("interface Planet class executed");

   }

 };

}


查看完整回答
反对 回复 2022-01-12
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

是否可以在不直接引用实现类的情况下调用方法?


不,这不可能。Interface and implementation class只是声明。要使用它,您必须使用new. 但是你不能这样做,因为你想使用PlanetImpl受保护的逻辑。


我认为,您不想实现自己的类声明,然后创建和使用它的新实例。我认为,只有一种方法是使用反射。使用它,您可以创建受保护类的实例,PlanetImpl然后以正常方式使用它。


Class<Planet> cls = (Class<Planet>)Class.forName("<full PlanetImpl class name, inclusing package>");

Constructor<Planet> constructor = cls.getDeclaredConstructor();

constructor.setAccessible(true);

Planet planet = constructor.newInstance();

planet.orbit();


查看完整回答
反对 回复 2022-01-12
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

在您的情况下,您必须在PlanetImpl某处创建该类的对象才能执行该方法。接口只有该方法的定义,没有实现。


查看完整回答
反对 回复 2022-01-12
  • 3 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号