首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

接口变了,兑现类的运行情况

2012-12-24 
接口变了,实现类的运行情况工作中遇到接口以后有可能增加方法的情况,原先以为接口一旦确定就不可能更改,但

接口变了,实现类的运行情况
工作中遇到接口以后有可能增加方法的情况,原先以为接口一旦确定就不可能更改,但是经群里“坦克”大哥的教诲,知道了接口和实现类在编译后的关系。

public interface IA{public void test();public void hello();}public class A implements IA{public static void main(String...args){A a = new A();a.test();}@Overridepublic void test(){System.out.println("test");}}public class B{public static void main(String...args) throws ClassNotFoundException,InstantiationException,IllegalAccessException{IA i = (IA) Class.forName("A").newInstance();System.out.println(i);i.test();i.hello();}}

如果是在eclipse中,那么A是可以编译通过并且成功执行的,不报任何错误(即使代码中会有小红线),但是用javac编译的话是通不过的。同理B在执行到i.hello()才会报错,在eclipse报的错的:java.lang.Error: Unresolved compilation problem:
The type A must implement the inherited abstract method IA.hello()
而在控制台中运行报的错是:Exception in thread "main" java.lang.AbstractMethodError: A.hello()V
由此可见eclipse中更加智能。

如果我们先把IA中的hello(),B中的i.hello()注释掉,那么所有编译都没问题,然后IA中的hello() 和B中的i.hello()打开,编译也是通过的(这里不要再编译A了)。此时执行A是没有任何影响的,执行B则会报AbstractMethodError错误。

总结:如果在接口中的方法变了,那么原先的实现类可以继续执行。如果是通过反射Class.forName().newInstance()然后多态来调用实现中没有的方法的话,那么会报错的。

只要实现类不重新编译,原先的实现类.class都是可以正常使用的。
同时要注意:通过多态去调用接口中新增、修改的方法,是报错的。

热点排行