抽象类和接口是java中非常重要的两个概念,是java多态的基础,在java的设计模式中他们无处不在,为了归纳记忆,我们总结下抽象类和接口的相同和不同之处。
我们先说说他们各自的特点:
接口:
1、接口不是一个类,这点从声明就可以看出来声明关键字为interface 而类的声明是class,但是接口是一种抽象类型。
2、接口不能被实例化,因此接口中也不能有构造器。
3、接口中的方法默认是public abstract 类型的,且不能由其他private 等修饰符修饰。
4、接口中的方法如果不是static类型的,那么方法必须是抽象的不能有方法体,但是一般不在接口中直接定义静态方法去执行代码块。
5、接口中可以声明变量,默认的是public static final的,因此是不能修改的。
6、接口中不能用this表类当前类对象。
7、接口可以多实现。
抽象类:
1、抽象类是一个类,用abstract修饰,用来声明该类是一个抽象的类。
2、抽象类本身不可以实例化,但可以声明构造器,用于继承它的子类初始化时初始化(如果要用new 抽象类必须要重写重写方法的实现)。
3、抽象类型既可以有抽象方法,也可以有非抽象的方法,抽象方法需要用abstract修饰,没有具体实现,没有方法体。
4、抽象方法只能单继承。
由此我们基本上可以总结出接口和抽象类的异同:
异:
一:声明方式不同:抽象类用abstract修饰,接口用interface修饰。
二:方法声明不同:抽象类中既可以有抽象方法,也可以有非抽象方法;而接口中方法不能存在方法默认是public abstract的没有方法体,但是可以用static修饰后写方法体。
三:变量声明不同:接口中的变量默认是public static final的,但是抽象类中不是。
四:this使用不同:接口中不能使用this指向当前对象(接口不能被实例化所以没有this对象),抽象类中存在this对象。
同:
一:接口和抽象类都是一种抽象的表现形式。
二:接口和抽象类都不能实例化。
三:接口和抽象类中抽象方法都不能有具体实现。