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

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


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();
}
@Override
public 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都是可以正常使用的。
同时要注意:通过多态去调用接口中新增、修改的方法,是报错的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值