抽象类与普通类相比最大的特点是约定了子类的实现要求;
但是抽象类有一个缺点:单继承局限,如果要想约定子类的实现要求以及避免单继承的局限就需要使用接口。在以后的开发设计之中:接口优先。在一个操作即可以使用抽象类又可以使用接口的时候,请优先考虑接口。
接口的基本概念
接口就是一个抽象方法和全局常量的集合,在java中接口可以使用interface关键字来进行定义
范例:定义一个接口
//接口和类的命名要求相同,所以在区分接口建议在接口前面追加I
interface IMessage{
public static final String MSG="1111111111111";
public abstract void print();//抽象方法
}
public class TestDemo1 {
public static void main(String[] args) {
}
}
但是如果
子类要想使用接口,那么就必须利
用implements关键字来实现(实例化 )接口,同时一个子类可以实现多个接口,也就是说可以
利用接口来实现多继承的概念。对于
接口的子类(
如果不是抽象类)则必须
覆写接口中的全部抽象方法。随后可以利用子类对象的向上转型(A a=new B())
通过实例化子类来得到接口的实例化对象。
interface IMessage{
public static final String MSG="1111111111111";
public abstract void print();//抽象方法
}
interface INews{
public abstract String get();
}
class MessageImpl implements IMessage,INews{
public void print(){
System.out.println(IMessage.MSG);
}
public String get(){
return IMessage.MSG;//访问常量都建议加上类名称,接口就是特殊的类
}
}
public class TestDemo1 {
public static void main(String[] args) {
INews m =new MessageImpl();//子类接口为父类实例化
//现在m标傲世的并不是INews,而是MessageImpl
//MessageImpl 是IMessage的子类 所以可以转化
IMessage ms=(IMessage)m;
system.out.println(m.get());}}
范例:观察接口间的转换
当再定义一个子类只与接口INews有关时
class NewImpl implements INews{
public String get() {
return null;
}
}
public class TestDemo2 {
public static void main(String[] args) {
INews m =new NewImpl();//与IMessage接口无关
IMessage ms=(IMessage)m;
System.out.println(m.get());
}
}
ClassCastException: .
NewImpl cannot be cast to
IMessage
当一个子类继承了多个接口之后,并且接口对象通过子类继续宁实例化,那么这多个接口之间是允许相互转换的