关于java接口的理解
请问java的接口除了在设计模式中运用外还有什么其他的功能?例如我在一个类中实现一个接口比不是为了运用代理也不是为了代码的重构,那还为什么要实现接口。还有API中定义的接口又有何种作用,接口是空方法体,为什么还能预先定义功能,我不覆盖的话功能不就不能实现了吗?望各位给我这个菜鸟解答解答
------解决方案--------------------
--我在一个类中实现一个接口比不是为了运用代理也不是为了代码的重构,那还为什么要实现接口。
Java不支持多继承,但你可以用一个类实现多个接口,同时继承一个类。这个是接口区别于抽象类的很大有点。
另外“运用代理也”以及“代码的重构”都是某种行为而不是它们的目的,目的是为了实现如USB电子设备那样的“大家既有某种共性,又有各自的特性”这样的结构。需要共性的时候,就用接口对象去承载任何的实现类。需要个性的时候就让他们还原成各自的类。
--还有API中定义的接口又有何种作用,
想想定义USB这种接口有什么作用? 从用户看来就是兼容性更好了,一个同样的接口可以用很多不同设备;从程序员来说就是程序更规范化了。先定义基本功能的抽象(共性),后面的实现类实现具体功能(个性),但都要符合基本功能的要求。
--接口是空方法体,为什么还能预先定义功能,
“为什么还能预先定义功能”
这个“功能”二字有些歧义。
若指的是整个接口的“功能”,是对的,也就是所有实现类都得至少实现这些定义好的方法。
若指的是接口里方法的“功能”,严格上说你没有预先定义功能,而只是预先定义了功能的抽象。定义功能=实现方法,是你写在实现类里的功能的实现。
--我不覆盖的话功能不就不能实现了吗?
是这样的。除非你这个方法就是什么都不做的。
实际应用中也可以用抽象类,但感觉接口比抽象类最大的优点,一个是如前所说的支持多实现,一个是接口就是完全的抽象,而抽象类可以作弊,里面的方法可以不抽象。
------解决方案--------------------接口是种类型的定义,是种规范的定义,我可以在没有实现的情况下直接针对接口编程(面对抽象编程,代码依赖于抽象而不是具体),大大降低了耦合性,代码更灵活。
如:
public void test(MyInterface face){ face.dosomething();}
------解决方案--------------------接口的作用主要是为了统一访问,在设计原则和设计模式中使用,为的是易于扩展,可复用,易于维护。这些问题你不考虑的话,可以不用接口。好比:三星安卓手机和HTC等,使用的数据线,可以通用,但苹果不遵循这一规范,只不过你不能用安卓手机的数据线给苹果手机使用。
关于你的第二个问题,造成这一问题的原因是,不遵循接口隔离原则和单一职责原则,不要定义的职责太多,要拆分,类可以继承多个接口,但只能继承一个类。
------解决方案--------------------接口的作用是实现多态。
比如:两个动物,猫和狗,定义两个类,都能实现run方法。那就实现一个接口A,接口A中有一个run方法,让猫和狗都继承接口。
那么在主类中,就可以写 A a = new Dog();a.run();
改为猫的话,只需要写成A a = new Cat(),其他地方不用改。
以此实现代码的有效性。