`
lg_asus
  • 浏览: 191778 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

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

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多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    在运行时,实际调用的是哪个实现类的方法,取决于引用变量实际指向的对象。 以下是一个简单的例子: ```java // 定义接口InterA interface InterA { void fun(); } // 实现接口InterA的类B class B implements ...

    让javaweb运行,提供servlet-api的接口实现。tomcat的实现类

    让javaweb运行,提供servlet-api的接口实现。tomcat的实现类

    thread 线程类 实现runnable接口

    Runnable 接口的实现类需要重写 run() 方法以提供线程的执行逻辑。 2. Thread 类 Thread 类是 Runnable 接口的实现类,它提供了线程的基本操作和管理。Thread 类包含了线程的状态、线程 ID、线程属性、线程优先级...

    动态实现接口

    动态类型在运行时解析,可以用于实现动态接口实现,但这种方式并不直接使用反射。 4. **IL(Intermediate Language)代码生成** `System.Reflection.Emit`命名空间中的类如`TypeBuilder`、`MethodBuilder`等,可以...

    易语言类实现IMalloc接口

    易语言类实现IMalloc接口源码,类实现IMalloc接口,Release,Alloc,Realloc,Free,GetSize,DidAlloc,HeapMinimize,类接口调用构造运行代码_0,类接口调用构造运行代码_通知_原代码发生变化,CoGetMalloc

    C++编程接口与实现的分离实例

    接下来,我们创建具体的实现类,例如`ChessGame`或`TicTacToeGame`,它们继承自`Game`抽象类,并提供这些接口的实现。在`ChessGame`中,`start()`可能包含设置棋盘和初始化玩家的逻辑,`playTurn()`处理玩家的每一步...

    C++接口实现总结

    这篇博客"《C++接口实现总结》"可能讨论了如何在C++中实现接口,以及它在实际开发中的应用。下面我们将详细探讨C++中实现接口的一些常见方法和相关知识点。 1. **抽象类(Abstract Class)**:C++通过包含纯虚函数...

    完美C语言接口源码实例实现接口实例

    实现接口的类或函数需要遵循接口定义的函数指针类型,提供相应的函数实现。在使用时,通过接口结构体的实例,调用其内部的函数指针,达到调用实际函数的目的。 6. **多态性**: 尽管C语言没有内置的多态机制,但...

    HIDL接口实现.pdf

    生成的文件通常包括接口的实现类文件(.cpp)和头文件(.h),以及Android构建系统(如Android.bp或Android.mk)中使用的配置文件。 3. 更新Makefile和注册HIDL服务:使用update-makefile.sh脚本更新Makefile,生成...

    Java语言的接口与抽象类

    2. 接口:接口提供了定义与实现的分离,保护实现类的知识产权,便于更换实现类,无需修改使用接口的代码。 在选择使用抽象类还是接口时,需要根据实际需求权衡。如果需要共享代码和方法,或者希望强制子类实现特定...

    AS3 简单接口实现

    在ActionScript 3 (AS3)中,接口...总结来说,AS3中的接口是实现类间协议的关键工具,它们定义了类必须提供的公共方法集,促进了代码的模块化和可扩展性。了解和熟练使用接口对于编写高效、健壮的AS3代码至关重要。

    接口的实现

    接口回调是接口实现的一个关键应用。在`SampleDisplay`类中,定义了一个`Soundable`类型的变量`sound`,它可以引用任何实现了`Soundable`接口的对象。`display()`方法接受一个`Soundable`类型的参数,通过接口回调调...

    C++中接口的实现.pdf

    在C++中,接口的实现主要依赖于抽象基类和多态性,这使得C++中的接口实现具有一定的灵活性和复杂性。 #### C++接口实现的步骤 1. **定义接口**:首先,我们需要定义一个抽象基类作为接口,该类中只包含纯虚函数,...

    用eclipse快速实现接口的方法

    在实际项目中,我们可能会遇到多个类实现同一个接口的情况,这时可以利用Eclipse的“Copy Type”功能复制已有的实现,作为新类的基础,再进行必要的修改。 总的来说,Eclipse提供了丰富的工具和功能,帮助开发者...

    JAVA获取同一路径下所有子类或接口实现类

    - `Intf`是示例中的接口,`Man`是它的实现类。`isAssignableFrom()`方法用于检查`Class`对象表示的类或接口是否可以被`cls`表示的类或接口赋值。如果`Man`是`Intf`的实现,则`Intf.isAssignableFrom(Man.class)`...

    DLL导出类的三种方法,导出接口类,导出类指针,导出类,不建议使用导出类

    这种方式比直接导出类更安全,因为类的实现细节对客户端隐藏,但仍然存在运行时的多态性问题,且可能涉及内存管理的复杂性。 3. 导出类 直接导出类意味着DLL会暴露类的完整定义,包括其数据成员和实现。这种方式的...

    接口的动态加载实现

    在编程领域,接口的动态加载是一种重要的设计模式,它允许我们的程序在运行时根据外部条件(如配置文件或数据库)动态地选择实现类,而无需修改核心代码。这种设计提高了软件的灵活性和可扩展性,使得系统能更好地...

Global site tag (gtag.js) - Google Analytics