接口与抽象类的对比
定义:
抽象类:无法具体描述事物时,使用抽象类。
接口:扩展功能。
定义格式:
抽象类:abstract class 类名A{}
接口:interface 接口名B{}
使用场景:
抽象类:主要用来抽象类别。
接口:主要用来抽象功能。
比如:子类除了需要重写父类的abstract方法,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
继承:
抽象类:是单一继承的,不能继承多个类,但父类可以有祖先类。
接口:可以同时实现多个接口(多重继承)。
实例化:
抽象类:不能实例化(因为抽象的东西不能具体描述)。
接口:不能实例化(因为接口中方法本身都是抽象的,接口本身也是抽象的)。
实现方式:
抽象类:需要被子类继承。
接口:需要被类实现。
方法的实现:
抽象类:方法有抽象方法和非抽象方法,即可以有具体的方法实现,也可以没有具体的方法。可以对方法声明,也可以实现方法。
接口:都是抽象方法,只能做方法的声明,不能实现方法。
方法:
抽象方法:没有方法体,以分号结束。
抽象类:如果是含有抽象方法,那么子类在继承时需要重写父类中的所有抽象方法,或者子类必须也得是抽象类。(因为抽象类就是用来继承的,子类在继承时把父类的抽象方法继承过来了,那么子类就必须是抽象方法,如果子类不想定义为抽象方法,那么子类就不能出现抽象方法,所以需要重写父类中的抽象方法。) 父类中如果有static方法,子类必须用static方法覆盖。
接口:接口中的所有方法都是抽象的,因为接口中的方法系统默认是public abstract。所以,在实现接口时,子类必须对接口中的所有方法进行重写。如果某一个子类只用到接口中的个别方法,那么对其他方法必须也得重写,只是他们的方法体为空。在方法重写时,由于接口的方法访问修饰符是public,而方法重写要求子类的访问权限不能父类的访问权限,所以子类的访问修饰符不能省略(省略的时候修饰符默认是友好的,访问权限低于public)。
构造方法:
抽象类:有构造方法。因为子类在创建对象初始化时,由于子类继承父类,需要先对父类进行初始化。
接口:无构造方法。因为在接口中的成员变量是系统默认添加修饰符:public final static,有final的存在,变量不能做修改,所以就变成了成员常量。既然没有成员变量了,那么就不需要初始化,所以也用不到构造方法。因为构造方法就是用来初始化的。
成员变量:
抽象类:有。
接口:无。因为成员变量系统默认的修饰符是final,所以就成了常量。
成员常量:
抽象类:有。
接口:有。(final修饰了)
修饰符:
抽象类:抽象方法不能用private、final来修饰,因为这两个次修饰之后就不能被子类继承了,就更不能被重写了。
接口:方法默认修饰符:public、static。属性默认修饰符:public、static、final