接口
接口:被interface修饰的类叫做接口,接口可以看做是抽象类的特例。
接口与抽象类的区别:在抽象类中可以定义抽象方法,也可以定义具体方法。但在接口中只能定义抽象方法和常量。接口可以看做是行为的抽象
接口的特点
想要使用接口,需要使用implements关键字,多态向下转型是需要使用关键字instanceof判断变量是否与转型的类型相匹配,防止转换异常。
在接口中定义的方法,都是公共方法。不能用provate和protected修饰接口方法。
用父类变量作为形参,可以传递仍和一个子类对象。用接口变量做形参,可以传递任何一个实现类对象。
接口中定义的变量都是公共的静态的常量。接口中不能使用常量,因为接口中定义的变量被接口的所有实现类所共享,如果接口中定义变量的话,变量在实现类A的改变会导致实现类B的改变,这样就可能会导致实现类B的错误。
一个接口可以继承多个接口,如果一个类实现一个接口,除了要实现该接口中定义的抽象方法以外,还要实现该接口父接口中的抽象方法。
//接口需要的关键字
interface Bs{
}
class C implements Bs{
public static void main(String[] args) {
Bs c = new C();
if(c instanceof C){
//匹配才能强转成功
}
}
}
抽象类
定义:如果一个方法只有定义,但没有具体的实现内容。那么该方法叫抽象方法。而拥有抽象方法的类,称之为抽象类,用关键字abstract定义。抽象类不能直接实例化。如果一个类继承抽象类,必须重写抽象类中定义的所有抽象方法。
abstract class C{
//抽象类中既可以书写普通方法,也可以书写抽象方法
public void m1(){
}
public abstract void m2();
}
抽象类和接口区别和联系:
1、抽象类和接口不能直接实例化。抽象类变量只能指向子类对象,接口变量只能指向实现类对象。
2、抽象类中可以定义抽象方法,也可以定义具体方法,但接口中只能定义抽象方法。
3、接口中定义的变量是公共的静态的常量。而抽象类中定义的变量是普通属性。
4、一个类只能继承一个父类,但是可以实现多个接口。
5、一个类继承一个抽象类,如果不全部实现抽象类中的抽象方法。那么该类只能是抽象类。同样,一个类实现一个接口,如果不全部实现接口中定义的抽象方法,那么该类只能是抽象类。
在抽象类和接口的选择上面,与生俱来的使用抽象类实现,扩展功能使用接口实现。