实例化没有实现类的接口

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

呼如林
浏览 308回答 3
3回答

达令说

使用匿名内部类我们可以做到。匿名类可以实现接口,我认为那时只有你有机会看到一个类实现了没有“implements”关键字的接口。interface Planet  {public void orbit();}class PlanetMain  {private Planet p = new Planet () {    public void orbit() {        System.out.println("interface Planet class executed");   } };}

摇曳的蔷薇

是否可以在不直接引用实现类的情况下调用方法?不,这不可能。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();

繁华开满天机

在您的情况下,您必须在PlanetImpl某处创建该类的对象才能执行该方法。接口只有该方法的定义,没有实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java