Day15
** 抽象类:**
猫Cat 狗Dog 动物Animal 案例 ,Cat 类 Dog类创建实例都可以有具体的对象与之对应。但是 Animal类的实例却没有具体的对象与之对应,也就是说Animal 作为父类 ,创建的对象没什么意义。而且当子类重写了父类的方法时 ,父类的这个方法 也没什么意义了所以java 提供了专门用来做继承设计父类的一个概念抽象类。
没有使用抽象类作为父类时的一些缺陷 :
父类是具体的类 : 父类自身创建的实例 没有具体对象 与之对应 意义不大
父类的某些方法 被子类重写,父类中的这些方法 也没有什么意义
父类无法限制子类 子类可以随意设计
为什么需要抽象类? 如何定义抽象类?
是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩展。
通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
抽象类 是用来 专门做父类 被继承使用的
抽象类的定义语法:
修饰符 abstract class 类名 {
}
抽象类的内部语法:
1. 普通类中有的元素 抽象类也可以有 比如 成员变量 构造方法 普通方法
2.抽象类中 可以定义抽象方法 使用 abstract 关键字 抽象方法没有方法体 ,抽象类中定义的
抽象方法 只是 描述 有这个功能,但是 抽象类不提供具体的实现,具体实现由子类提供。
修饰符 abstract 返回值类型 方法名(方法参数); 注意:没有方法体
3.抽象类不能创建自身的实例
4.抽象类有构造方法 但是不能创建自身实力 构造方法的意义 是 创建子类实例的时候 初始化父类的数据 给子类实例使用
5.含有抽象方法的类 只能定义成抽象类 也就说 一个类 如果有抽象方法 那这个类一定是抽象类, 但是 一个
抽象类 不一定有抽象方法
6. 抽象类对子类的限制 如果 一个子类 没有实现抽象父类的所有的抽象方法 那么这个子类也要被定义成抽象类
换句话说: 一个子类 继承了抽象类 要么 要实现这个抽象类中的所有抽象方法 ,要么 这个子类也要被
定义成抽象类
总结:
抽象类的成员变量 跟 具体类没啥区别 一样使用
抽象类的成员方法:
可以是具体方法: 子类可以直接调用 提高代码的复用性
可以是抽象方法: 强制子类去实现
关于 abstract 关键字
修饰类 抽象类 需要被继承
修饰方法 抽象方法 必须被实现
final 和 abstract 互斥
private 和 abstract 互斥
static 和 abstract 互斥
- 抽象类 抽象的是 类别 类型
- 接口: 抽象的是功能
接口
接口: 是专门描述 具备某个功能 或 某种方法的一个概念 是一种引用数据类型 它只对外描述具备哪些功能
却不提供具体的实现,具体的实现由接口的实现类来提供
接口 专门设计出来 用来被实现的 或者 描述功能的 通过 interface 关键字来定义
如果某个类 实现了这个接口 那么这个类就必须实现接口中定义的所有方法
接口:
1.概念性的接口 宏观上的接口 指的是系统对外提供的服务
2.使用interface 关键字 定义的接口 也称为接口类型 它用于明确的描述系统对外提供的服务 能够更加清晰的
把接口 和 实现细节分离
咱们在这 研究 interface 定义的接口
语法: 修饰符 interface 接口名 [extends 父接口1, 父接口2,父接口3.....] {
public static final varType varName = value;
public abstract 返回值类型 方法名(参数类型 参数名.....);
//JDK8 之前 接口中只有 上述内容
//JDK 8以后 可以在接口中 定义 static 方法 和 default 方法
详情 看具体例子 JDK8Interface.java JDK8Interface2.java JDK8InterfaceImpl.java
}
实现接口的语法:
修饰符 class 类名 [extends 类名 implements 接口1,接口2.。。。。。]{
}
接口总结:
1.接口中的成员变量 默认 都是 public static final 修饰的 常量 必须显示初始化
2.JDK8之前 定义的 方法 都是 public abstract 修饰的 抽象方法 没有方法体
3.JDK8 之后 接口中 可以定义 静态方法 和 默认方法
4.接口中不能定义构造方法 也不能创建接口自身的实例
5.一个接口不能实现另外一个接口 但是 可以继承多个其他接口 对于java接口来说 支持多继承
6.接口必须通过它的实现类 实现它的抽象方法 实现接口的关键字 是 implements
7.与子类实现抽象父类类似,当一个类实现了某个接口时 它必须实现这个接口中的所有抽象方法 否则 这个类必须被定义成抽象类
8.不允许创建接口自身的实例 但是允许 接口类型变量 引用实现类的实例 即接口应用指向子类对象
9.一个类只能继承一个直接父类 但是 可以实现多个接口
比较抽象类和接口
相同点: 二者都代表了系统的抽象层 不能实现自身的实例化 都可以包含抽象方法
经常写的代码 父类引用 指向子类对象 , 接口引用 指向子类对象
不同点: 抽象类可以有构造方法 可以有具体方法
jdk8的接口中 只能定义 public abstract 的 方法 public static final 的变量 静态方法 和 默认方法
抽象类要被子类继承 接口要被类实现