在java面向对象编程的,抽象类和接口始终存在有疑问的地方,因为两者太多相似有太多不同,在刚开始学习的时候经常弄的不对,使用情景搞混,今天来总结之前学习Java中接口和抽象类的问题。
抽象类
了解:只声明,未具体实现。
abstract void cry();
抽象方法必须使用关键字abstract进行修饰,如果一旦一个类中包含了abstract方法,那么这个类必须使用abstract进行修饰;因为抽象类中含有未实现的方法,抽象类不能被实例化;抽象类不一定包含抽象方法,也就是说抽象类可以没有抽象方法(那么这个抽象类为什么要设计呢?);抽象方法不能存在方法体;抽象类可以有实现了的方法当一类继承的父类是抽象类时,必须全部实现抽象类的抽象方法。
对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
接口
设计思想:高内聚低耦合
[public] interface InterfaceName { }
使用implement关键字遵循接口:
class Animalimplements Interface1,Interface2,[....]{ }
当一类实现多个接口时,如果此类事非抽象类那么必须实现该接口的全部方法;
原则:
当一类实现了一个接口,就要实现此接口的全部方法;
接口不能被实例化(正是由于接口的变量不能用private protected修饰,默认 public static final,而方法被隐式地指定为public abstract方法用其他关键字,比如private、protected、static、 final等修饰会报编译错误))
接口中所有方法不能有方法体,也就是说必须是抽象方法;
定义在接口中的变量,作为全局变量使用:访问形式 接口名.变量名。
接口不能继承类,但是可以继承其他的接口。
两者对比
一个类只能单继承一个抽象类。但是一个类可以实现多个接口。
成员变量:抽象类可以是任何类型,接口只能是public static final类型。
成员方法:抽象类可以提供实现的方法体,接口中只能存在public abstract 方法。
静态方法|代码块:接口中不存在,抽象类可以有。