在 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 方法用其他关键字, 比如 privateprotectedstatic final 等修饰会报编译错误))
接口中所有方法不能有方法体, 也就是说必须是抽象方法;
定义在接口中的变量, 作为全局变量使用: 访问形式 接口名. 变量名
接口不能继承类, 但是可以继承其他的接口
两者对比
一个类只能单继承一个抽象类但是一个类可以实现多个接口
成员变量: 抽象类可以是任何类型, 接口只能是 public static final 类型
成员方法: 抽象类可以提供实现的方法体, 接口中只能存在 public abstract 方法
静态方法 | 代码块: 接口中不存在, 抽象类可以有
来源: http://www.bubuko.com/infodetail-2523655.html