我们思考一个问题,虽然我说过汽车类,但是你知道我说的是什么汽车吗?
只有看到了具体的汽车,我们才会明白,这是什么汽车。
也就是说,汽车本身并不是一个具体的,而是一个抽象的事物。只有真正的宝马车,才是具体的汽车。
同理,我们也可以推想,不同的汽车run方法的实现应该是不一样的,
所以,我们没必要在汽车类中的run方法给出具体实现,仅仅给出一个声明即可。
在Java中,如果一个没有方法体,没有实现的方法定义为抽象方法,
一个类中一旦出现抽象方法,该类一定是一个抽象类
1.抽象类使用 abstract 关键字修饰
2.有一个抽象方法的类一定是抽象类
3.一个抽象类可以没有抽象方法
4.没有抽象方法的抽象类有意义, 防止外界创建对象
防止外界创建对象的方式:
a.构造方法私有
b.抽象类
c.接口
d.内部类
5.抽象类不能够实例化
6.如果我想要"实例化"抽象类,怎么做 --> 利用多态
7.抽象类也可以创建匿名内部类对象
匿名内部类的格式:
new 类名() {
重写方法
}
8.抽象类的子类特点:
a.如果一个子类想要继承抽象类,就必须实现抽象类中的所有的抽象方法
b.如果一个子类不想要实现抽象类中的抽象方法,子类必须升级为抽象类
9.抽象类和普通类的区别:
抽象类中是否有 常量 成员变量 成员方法 构造方法 静态方法?
有的话又有什么意义呢?
成员变量 成员方法 构造方法 给子类用
常量 静态方法 直接类名方法
构造方法: 帮助子类初始化父类继承下去的成员
10.private final native static protected public 哪些可以修饰抽象方法,哪些不可以,说出为什么?
private final native和 抽象方法冲突
static 和 抽象方法无意义
protected public 和 抽象方法可以共存
11.抽象类的本质就是一个彻头彻尾的服务类,所有的成员都给子类使用,自己不能实例化,燃烧自己,服务子类
抽象类可以是一个模板
在生活中
1.接口是一种规范
2.接口是灵活的
3.接口是可以扩展功能
从宏观上理解: 接口开发
应用: 后台接口开发, 前端界面(UI)
从微观理解: 类似于方法 Java里面接口 interface
Java当中的接口
接口是一种比抽象类还要抽象类
接口的格式:
interface 接口名 {
常量 和 抽象方法的集合
注意: 在JDK1.8之后还可以有 静态方法和默认方法
}
接口的实现类格式:
class 接口名Impl implements 接口名 {
// 实现接口中所有的抽象方法
}
接口的特点:
1.接口使用 interface关键字修饰
2.接口是常量和抽象方法的集合,在JDK1.8之后还可以有 静态方法和默认方法
3.接口中的常量默认省略 public static final
接口中的方法默认省略 public abstract
4.接口不能够实例化
5.如果想要"实例化"一个接口,必须使用多态【接口多态】
6.接口的子类特点:
a.如果一个类想要实现一个接口,那么就必须实现该接口中所有的抽象方法
b.如果一个类不想要实现接口,那么该类升级为接口
1.接口使用 interface关键字修饰
2.接口是常量和抽象方法的集合,在JDK1.8之后还可以有 静态方法和默认方法
3.接口中的常量默认省略 public static final
接口中的方法默认省略 public abstract
4.接口不能够实例化
5.如果想要"实例化"一个接口,必须使用多态【接口多态】
6.接口的子类特点:
a.如果一个类想要实现一个接口,那么就必须实现该接口中所有的抽象方法
b.如果一个类不想要实现接口,那么该类升级为接口
7.接口是一种规范
8.接口是可以扩展功能
9.接口是灵活的
10.接口和抽象类的区别
父类是普通类的是模板,父类是抽象类是部分模板,部分规范,父类是接口的时候,就是完全规范
11.
类和类: 单继承 不能多继承,不能多实现
类和接口: 多实现, 不能够多继承
接口和接口: 多继承, 不能多实现
12.什么时候使用接口? 什么时候使用继承?
当抽取多个共性代码或者设计复杂类的时候使用继承,其他一律接口
13.面向接口编程
集合框架 Collection List
类的组成
包的声明; package
导包; import
[访问权限修饰符] class 类名 extends 父类 implements 接口1, 接口2,…, 接口n{
任何一个类都有一个父类 Object类
封装:
1.给成员添加 访问权限修饰符
2.提供get / set 方法
3.给属性的读写添加数据校验
继承: 继承是对一批类的抽象,一般用来抽取共性代码
多态: 父类引用指向子类对象
继承多态
接口多态
组合
抽象类和接口的区别
常量 字面值常量 自定义常量
成员变量 this super
类变量 static
构造方法
无参构造方法
全参构造方法
构造方法重载
成员方法
普通方法
get/set方法
方法重载
方法重写
静态方法 static
本地方法 native
内部类
1.成员内部类 private
2.局部内部类
3.静态内部类
4.匿名内部类
内部抽象类
内部接口
多态的必要条件:
1.必须存在继承关系
2.必须存在方法重写
3.父类引用指向子类对象
多态的概述:
生活上: 同一个动作在不同的环境下体现出来的不同的结果
代码中: 父类引用指向子类对象
成员变量: 编译时期看左边类型,运行时期看左边类型
成员方法: 编译时期看左边类型,运行时期看右边类型
构造方法: 帮助子类初始化父类继承过来的成员
静态方法: 编译时期看左边类型,运行时期看左边类型
缺点: 通过多态的父类引用无法访问子类所特有的方法
向上转型(自动转换)
格式:<父类型> <引用变量名> = new <子类型>();
特点:
子类转为父类 父类的引用指向子类对象。自动进行类型转换
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
此时通过父类引用变量无法调用子类特有的属性和方法
向下转型(强制转换)
格式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
特点:
父类转为子类,父类引用转为子类对象。理解为强制类型转换
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常
ClassCastException
异常名称: 类型转换异常
产生原因: 在向下转型的过程中没有转换成真实的类型
解决办法: 对父类的所有子类做逐一类型判断
instanceof关键字
格式: 左边对象 instanceof 右边类
作用: 判断左边对象是否属于右边类的实例,是返回true,不是返回false
目前我们知道使用向下转型 + instanceof关键字能够解决多态的缺点
但是我们清楚 如果需要对父类的所有子类做逐一判断,可能存在安全隐患或者违反开闭原则
但是还有一个Object类,该类有无数个子类,所以如果父类引用是Object,那么安全隐患永远存在
后期考虑使用泛型改进