今日内容
零、 复习昨日
一、final
二、static
三、多态
四、向上转型&向下转型
五、多态应用
零、 复习昨日
0 类封装步骤
- 属性私有private
- set,get方法
1 继承的好处
- 减少重复
- 多态的前提条件
2 子类可以使用父类什么
- 子类可以使用父类 非私有 属性和方法
3 方法重写的要求
- 访问修饰符 >= 父类
- 返回值类型要与父类一致
- 方法名要一致
- 参数列表一致
4 访问修饰符的权限大小
public>protected>缺省>private5 this和super 总结表格
- this不代表父类对象!!!
- 表格见笔记
6 有继承时创建对象的过程
- 先父类, 再属性初始化 后执行构造
- 后子类, 再属性初始化 后执行构造
一、作业
重要作业,需要花10分钟尝试一遍,如果不会写
- 记当时自己心路历程,尽可能完整
- 等我讲的是时候 重点听
见项目包com.qf.pdf6_t19和com.qf.pdf6_t24
二、final
修饰符,用来修饰类,属性和方法
2.1 修饰类
final修饰类,类不能被继承
2.2 修饰变量
final修饰成员变量,局部变量,变量不再变化,即变成常量!!
注意: 命名规范要求
- 变量命名是首字母小写,其余单词大写!
- 常量命名是全部大写,多个单词中间_分开
2.3 修饰方法
final修饰方法,方法不能被 重写!!
2.4 总结
不管修饰类,变量,方法,其实本质是一样,因为final 单词,释义 最终,最后的
所以
- 最后的类,不能被继承
- 最后的变量,不能改变
- 最后的方法,不能重写
2.5 练习
public static void main(String[] args) {final Dog[] dogs = new Dog[3];dogs[0] = new Dog();// 数组内部的东西是可以改变的dogs[0] = new Dog();// dogs本身引用不能再改变// dogs = new Dog[4];final Dog dog = new Dog( );dog.name = "大黄";// 对象内的属性是可以变的dog.name = "小黄";// dog = new Dog(); // 对象的引用不能变}
三、static
3.1 语法解释
:写法: static修饰符,修饰类,属性和方法,
一般常见,常用的是修饰属性 和 方法
特性:
- 凡是被static修饰的属性,方法会随着 类加载 而初始化
- 凡是被static修饰的属性,方法在内存只有一份,被当前类的所有对象共享
- static修饰的属性和方法称为类方法,类属性(属于类)
- 没有被static修饰的属性和方法称为对象方法,对象属性(属于对象)
特殊用法:
- 因为static修饰的属性和方法会随着类加载而初始化,即
- 不需要创建对象,属性和方法即可使用!!!
- 静态方法不能调用非静态属性和方法
- 是因为静态是随着类加载就出现,而对象是new的时候才出现的,即有静态不一定有对象
3.2 用法
用法1: 设计的方法为了
方便调用
的时候,可以设计成静态方法
- 例如: Arrays.sort() Arrays.toString()
用法2: 设计的程序中属性需要被
多个对象共享
时,可以将属性设置成静态 的
- 例如: 多个窗口要共享火车票数据, 多个学生要共享老师对象
用法3: static一般会配合final,去修饰静态 常量
例如:
public static final double PI = 3.14159265358979323846;
ps: public static final这三个修饰符顺序原则上怎么写都行,但是建议是按照public static final顺序
三、多态
3.1 什么是多态
生活多态: (多种形态)
- 蝌蚪–>青蛙
- 迪迦(蓝色,红色,红蓝)
- 铁甲小宝
代码的多态:(主要是指方法多种表现形式)
- 同一个对象的同一个方法会出现不同的结果
3.2 如何形成多态
想要形成多态,要同时满足前提
- 先有继承(子父类关系)
- 重写方法
- 父类引用指向子类对象(向上转型)
// 父类
// 子类
// 向上转型,展现多态
3.3 作用?好处?
多态可以让代码很灵活,扩展性强!减少耦合度!
举例: 现有需求,设计方法,传入对应的动物对象,展现对应动物的吃的行为
如果没有多态,此题该怎么写?如下
再扩展一下: 现在动物园来了一个新动物,也要展现其吃的行为,怎么办?
此时需要,再修改代码,单独加一个方法来适应这个新动物!!!
此时,思考!!! 如果有很多新动物??? 要设置很多新的方法, 不灵活,扩展性差!
这时 利用多态,此题非常简单, 做到以不变应万变!!!
3.4 练习
改造形状题目为多态
创建一个长度为3 的数组,里面有三个不同 类型的对象,分别打印这三个对象的周长和面积。
四、向上转型&向下转型
父类引用指向子类对象,就是向上转型(子对象变父对象)
什么时候需要向上转型,想要表现多态的时候就可以向上转型!
向下转型(父对变子对象),父类对象指向子类引用!
/*** 向下转型* 以下这都是向下转型,但是第一遍会失败* 第二遍这个成功!* --------* 为什么?* 要想向下转型成功,得向上再向下*/// Animal animal2 = new Animal();// Dog dog = (Dog) animal2;// 不行!!Animal animal3 = new Dog();// 先向上Dog dog = (Dog) animal3;// 再向下,能转成
// ps: 这些其实就是之前的类型转换问题
为什么需要向下转型?
- 需要调用子类特有的方法
场景: 猪狗猫等类都有共同的方法:eat(),此时每一个动物还有不同的特有的方法,要表现出来
但是这样可以调用狗类特有方法,但是不适用,因为其他动物不能转为Dog类,怎么解决?
- 思路: 判断这个animal是哪个子类对象向上转型,我再对应的向下转型为哪个子类
- 利用jdk提供 instanceof方法来判断animal是哪个类的实例
练习
pdf6_t14
五、多态应用
场景1: 方法的参数列表是父类,调用该方法时,传入子类,方法表现出子类特点
场景2: 设计父类型数组,存储子类对象元素
场景3: 方法的返回值类型是父类,但是return的值是子类
六、总结
final
- 修饰类,不能继承
- 修饰变量,变量为常量,注意变量的命名
- 修饰方法,方法不能重写
static
- 静态的方法和属性,可以通过类名直接调用,不用创建对象
- 静态的方法和属性,在内存只有一个,会共享
多态
- 多态的前提(继承,重写,向上转型)
- 多态好处: 扩展,方便
- 记住常用的应用场景
- 记住一句话: 编译看父类,运行看子类
- 了解向下转型(其实就是类型转换)