相同:
- 接口和抽象类都能定义方法和属性,都是看作是一种特殊的类。大部分的时候,定义的方法要子类来实现
- 抽象类和接口都可以不含有抽象方法。接口没有方法就可以作为一个标志。比如可序列化的接口Serializable,没有方法的接口称为空接口。没有抽象方法的抽象类,小编不知道有什么作用,总之是可以通过编译的。
- 抽象类和接口都不能创建对象。
- 抽象类和接口都能利用多态性原理来使用抽象类引用指向子类对象。
- 继承和实现接口或抽象类的子类必须实现接口所有方法或抽象类的所有的抽象方法,抽象类若有没有实现的方法就继续作为抽象类,要加abstract修饰。若接口的子类没有实现的方法,也要变为抽象类。
不同点:
- 接口能够多实现,而抽象类只能单独被继承,其本质就是,一个类能继承多个接口,而只能继承一个抽象类。
- 方法上,抽象类的方法可以用abstract 和public或者protect修饰。而接口默认为public abttact 修饰。
- 抽象类的方法可以有需要子类实现的抽象方法,也可以有具体的方法。而接口在老版本的jdk中,只能有抽象方法,但是Java8版本的接口中,接口可以带有默认方法。
- 接口只能继承接口。而抽象类可以继承普通的类,也能继承接口和抽象类。
- Java8中的接口中的默认方法是可以被多重继承的。而抽象类不行。
- 属性上,抽象类可以用各种各样的修饰符修饰。而接口的属性是默认的public static final
- 抽象类中可以含有静态代码块和静态方法,而接口不能含有静态方法和静态代码块。
- 抽象类可以含有构造方法,接口不能含有构造方法。
- 设计层面上,抽象类表示的是子类“是不是”属于某一类的子类,接口则表示“有没有”特性“能不能”做这种事。如飞机和鸟都能飞,但是他们在设计上实现一个Fly接口,实现fly()方法。远比两个类继承飞行物抽象类好得多。因为,飞机和鸟有太多的属性不一样。
- 设计层面上,另外一点,抽象类可以是一个模板,因为可以自己带集体方法,所以要加一个实现类都能有的方法,直接在抽象类中写出并实现就好,接口在以前的版本则不行。新版本Java8才有默认方法。