三. 多态
1. 多态
- 多态: 指同一种事物的多种体现形式.
多态的前提
- 要有继承或者实现关系(子父类)
- 要有方法的重写
- 要有父类引用指向子类对象
2. 多态的访问特点
- 属性(成员变量)
- 成员变量都用private修饰, 提供了get/set方法
- 编译看左边(父类), 运行也看左边(父类)
- 行为(成员方法)
- 编译看左边(父类), 运行看右边(子类)
3. 多态的好处(使用)
- 多态的好处主要体现在: 参数的传递
- 形参是父类类型, 可以传入所有子类对象
4. 多态的弊端
- 当写出了多态(父类引用指向子类对象), 父类的引用不能直接调用子类特有的属性和行为.
向上转型: 多态本身就是子类类型默认转换到父类类型的过程.
Animal a = new Dog();
// 隐式类型转换(自动类型转换)
double a = 10; // int类型的10, 自动转换成double类型
向下转型: 父类类型转换到子类类型的过程, 这个过程必须是强制的
Dog d = (Dog)a;
// ========================
double a = 10;
// 不想用double类型的a, 我想用int类型
// 强制类型转换(显式类型转换)
int i = (int)a;
向上转型是默认的, 只要有多态, 就有向上转型
什么时候需要向下转型?
父类引用需要调用子类特有的属性和行为的时候, 需要向下转型;
向下转型的时候可能遇到的问题
- ClassCastException : 类型转换异常
- 解决方案:
instanceof
A instanceof B :
得到一个boolean类型的结果
结果代表了A是否是B的类型
四. 内部类
1. 成员内部类
- 位置: 类中方法外
- 格式
class 类A { // 外部类
class 类B { // 内部类
}
}
-
场景:
- 汽车类, 需要内部类(发动机)
- 人类, 需要内部类(心脏)
-
访问特点:
- 1.内部类可以直接访问外部类中的成员,包括私有成员
- 2.外部类要访问内部类中的成员,必须要建立内部类的对象
如果内部类中定义了静态成员,该内部类也必须是静态的
2. 匿名内部类
前提
- 存在一个类或者是接口(类可以是抽象类也可以是非抽象类)
格式
new 类名() {};
new 接口名() {};
本质
new 类名() {};
代表继承了该类的子类对象.
new 接口名() {};
代表实现了该接口的实现类对象.
五. 代码块
-
普通代码块
- 位置: 方法中
- 格式:
{}
- 作用:划分作用域(限制局部变量的作用范围,提前释放内存)
-
构造代码块
- 位置: 类中方法外
- 格式:
{}
- 执行方式: 每次创建对象都会执行构造代码块, 优先于构造方法执行
- 作用:对对象进行初始化
-
静态代码块
- 位置: 类中方法外
- 格式:
static { }
- 执行方式: 随着类的加载而执行(只执行一次), 优先于构造方法(构造代码块)执行
- 作用: 类被加载到内存时执行,且只执行一次,可用于项目中仅需执行一次的操作
静态代码块和静态成员变量(类变量), 谁在前, 谁先执行.
-
同步代码块