工作中遇到接口以后有可能增加方法的情况,原先以为接口一旦确定就不可能更改,但是经群里“坦克”大哥的教诲,知道了接口和实现类在编译后的关系。
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都是可以正常使用的。
同时要注意:通过多态去调用接口中新增、修改的方法,是报错的。
分享到:
相关推荐
这篇博客“项目运行期间热插拔接口实现类”可能探讨了如何在Java项目中实现这一功能。通常,这个过程会涉及以下几个关键点: 1. **自定义类加载器(Custom ClassLoader)**:创建一个继承自`java.lang.ClassLoader`...
在运行时,实际调用的是哪个实现类的方法,取决于引用变量实际指向的对象。 以下是一个简单的例子: ```java // 定义接口InterA interface InterA { void fun(); } // 实现接口InterA的类B class B implements ...
让javaweb运行,提供servlet-api的接口实现。tomcat的实现类
Runnable 接口的实现类需要重写 run() 方法以提供线程的执行逻辑。 2. Thread 类 Thread 类是 Runnable 接口的实现类,它提供了线程的基本操作和管理。Thread 类包含了线程的状态、线程 ID、线程属性、线程优先级...
动态类型在运行时解析,可以用于实现动态接口实现,但这种方式并不直接使用反射。 4. **IL(Intermediate Language)代码生成** `System.Reflection.Emit`命名空间中的类如`TypeBuilder`、`MethodBuilder`等,可以...
易语言类实现IMalloc接口源码,类实现IMalloc接口,Release,Alloc,Realloc,Free,GetSize,DidAlloc,HeapMinimize,类接口调用构造运行代码_0,类接口调用构造运行代码_通知_原代码发生变化,CoGetMalloc
接下来,我们创建具体的实现类,例如`ChessGame`或`TicTacToeGame`,它们继承自`Game`抽象类,并提供这些接口的实现。在`ChessGame`中,`start()`可能包含设置棋盘和初始化玩家的逻辑,`playTurn()`处理玩家的每一步...
这篇博客"《C++接口实现总结》"可能讨论了如何在C++中实现接口,以及它在实际开发中的应用。下面我们将详细探讨C++中实现接口的一些常见方法和相关知识点。 1. **抽象类(Abstract Class)**:C++通过包含纯虚函数...
实现接口的类或函数需要遵循接口定义的函数指针类型,提供相应的函数实现。在使用时,通过接口结构体的实例,调用其内部的函数指针,达到调用实际函数的目的。 6. **多态性**: 尽管C语言没有内置的多态机制,但...
生成的文件通常包括接口的实现类文件(.cpp)和头文件(.h),以及Android构建系统(如Android.bp或Android.mk)中使用的配置文件。 3. 更新Makefile和注册HIDL服务:使用update-makefile.sh脚本更新Makefile,生成...
2. 接口:接口提供了定义与实现的分离,保护实现类的知识产权,便于更换实现类,无需修改使用接口的代码。 在选择使用抽象类还是接口时,需要根据实际需求权衡。如果需要共享代码和方法,或者希望强制子类实现特定...
在ActionScript 3 (AS3)中,接口...总结来说,AS3中的接口是实现类间协议的关键工具,它们定义了类必须提供的公共方法集,促进了代码的模块化和可扩展性。了解和熟练使用接口对于编写高效、健壮的AS3代码至关重要。
接口回调是接口实现的一个关键应用。在`SampleDisplay`类中,定义了一个`Soundable`类型的变量`sound`,它可以引用任何实现了`Soundable`接口的对象。`display()`方法接受一个`Soundable`类型的参数,通过接口回调调...
在C++中,接口的实现主要依赖于抽象基类和多态性,这使得C++中的接口实现具有一定的灵活性和复杂性。 #### C++接口实现的步骤 1. **定义接口**:首先,我们需要定义一个抽象基类作为接口,该类中只包含纯虚函数,...
在实际项目中,我们可能会遇到多个类实现同一个接口的情况,这时可以利用Eclipse的“Copy Type”功能复制已有的实现,作为新类的基础,再进行必要的修改。 总的来说,Eclipse提供了丰富的工具和功能,帮助开发者...
- `Intf`是示例中的接口,`Man`是它的实现类。`isAssignableFrom()`方法用于检查`Class`对象表示的类或接口是否可以被`cls`表示的类或接口赋值。如果`Man`是`Intf`的实现,则`Intf.isAssignableFrom(Man.class)`...
这种方式比直接导出类更安全,因为类的实现细节对客户端隐藏,但仍然存在运行时的多态性问题,且可能涉及内存管理的复杂性。 3. 导出类 直接导出类意味着DLL会暴露类的完整定义,包括其数据成员和实现。这种方式的...
在编程领域,接口的动态加载是一种重要的设计模式,它允许我们的程序在运行时根据外部条件(如配置文件或数据库)动态地选择实现类,而无需修改核心代码。这种设计提高了软件的灵活性和可扩展性,使得系统能更好地...