Day09
---------------------------------------------------------------------------------
今天内容:
(1)继承
(2)访问控制
(3)final关键字
(4)对象创建的过程
(5)多态
1.继承(重中之重)
1.1 this关键字和super关键字的比较(熟悉)
(1)基本概念
this关键字主要用于代表本类的对象;
super关键字主要用于代表父类的对象;
(2)使用方式
使用this.的方式可以访问本类的成员变量和成员方法;
使用super.的方式可以访问父类的成员变量和成员方法;
使用this()的方式在构造方法的第一行可以调用本类中的其他构造方法;
使用super()的方式在构造方法的第一行可以调用父类的构造方法;
要求大家掌握的内容:
a.使用this.的方式可以区分同名的成员变量和形参变量;
b.使用super(实参)的方式可以调用父类中的构造方法;
c.使用super.的方式可以调用父类中被重写的方法;
1.2 方法的重写(重点、Override)
(1)基本概念
从父类中继承下来的方法不足以满足子类的需求时,则需要在子类中重新写一个与父类中一样的方法来覆盖从父类继承下来的方法,叫做方法的重写。
(2)重写的原则
a.要求方法名相同、参数列表相同、返回值类型相同,从jdk1.5开始允许返回子类类型。
b.要求访问权限不能变小,可以相同或者变大。
c.要求不能抛出更大的异常(异常机制)。
2.访问控制
2.1 常见的访问控制符(笔试题)
访问控制符 访问权限 本类内部 本包中的其它类 子类内部 其它包其它类
--------------------------------------------------------------------------------
public 公有的 ok ok ok ok
protected 保护的 ok ok ok no
啥也不写 默认的 ok ok no no
private 私有的 ok no no no
要求大家掌握的内容:
a.public修饰的内容可以在任意位置使用;
b.private修饰的内容只可以在本类内部使用;
c.通常情况下,成员变量都使用private修饰,成员方法都使用public修饰;
2.2 包的定义
package 包名; - 用于定义单层包;
package 包名1.包名2...包名; - 用于定义多层包,也就是多层目录。
3.final关键字(重点)
3.1 基本概念
final本意为"最终的,不可更改的",该关键字可以修饰类、成员方法以及成员变量。
3.2 使用方式
final关键字修饰类表示该类不能被继承。
- 为了防止滥用继承,如:java.lang.String类、System类等。
final关键字修饰成员方法体现在该方法不能被重写。
- 为了防止不经意间造成的重写,如:java.text.SimpleDateFormat类中format方法等
final关键字修饰成员变量表示必须指定初始值而且不能更改。
- 为了防止不经意间造成数据的改变,如:java.lang.Thread类中MAX_PRIORITY等
扩展:
在以后的开发中很少单独使用final关键字和static关键字修饰成员变量,通常都是采用public static final共同修饰来表达常量的概念,常量的命名规范是:所有字母大写,不同单词之间采用下划线连接。
如:
public static final double PI = 3.14;
4.对象创建的过程(了解)
4.1 单个对象创建的过程
(1)main()方法是程序的入口,当创建对象时会在堆区申请一块存储空间;
(2)当成员变量没有指定初始值时,则采用默认初始化方式进行处理;
(3)当成员变量采用显式初始化进行处理时,则成员变量的数值为指定的数值;
(4)执行构造块中的代码可以修改成员变量的数值;
(5)执行构造方法体中的代码可以再次修改成员变量的数值;
(6)此时对象构造完毕,继续执行后续的代码;
4.2 子类对象创建的过程
(1)main()方法是程序的入口,当创建对象时会在堆区申请一块存储区域;
(2)先加载父类再加载子类,因此先执行父类静态代码块再执行子类静态代码块;
(3)执行父类的构造块和父类的构造方法体,此时子类对象中包含的父类部分构造完毕;
(4)执行子类的构造块和子类的构造方法体,此时子类对象构造完毕,继续向下执行;
5.多态(重中之重 难点)
5.1 基本概念
多态就是指同一种事物表现出来的多种形态。
人:学生、教师、工人、司机、...
饮料:可乐、雪碧、乐虎、红牛、脉动、...
宠物:猫、狗、鸟、鱼、小强、...
整数:byte b1 = 10; short s1 = 10; int i1 = 10; ...
...
5.2 语法格式
父类类型 引用变量名 = new 子类类型();
如:
Person pw = new Worker();
pw.show();
解析:
在编译阶段pw是Person类型的引用,因此只能调用Person类中的show()方法;
在运行阶段pw指向Worker类型的对象,因此最终调用Worker类中重写以后的show()方法。
5.3 多态的效果
(1)当父类引用指向子类对象时,父类引用可以直接调用父类中成员方法;
(2)当父类引用指向子类对象时,父类引用不可以直接调用子类独有的成员方法;
(3)对于父子类都有的非静态成员方法来说,编译阶段调用父类版本,运行阶段调用子类版本
(4)对于父子类都有的静态成员方法来说,编译和运行阶段都调用父类版本;
5.4 引用类型之间的转换
(1)引用数据类型之间的转换分为两种:自动类型转换 和 强制类型转换。
其中自动类型转换主要指小范围到大范围的转换,也就是子类到父类的转换。
(2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
(3)若拥有父子类关系则编译通过,若目标类型不是该引用真正指向的对象类型则运行阶段
发生类型转换异常。
(4)为了避免上述错误的发生,每次强转之前应该进行类型的判断,具体如下:
if(父类类型的引用变量名 instanceof 目标类型){}
- 判断引用指向的对象是否为目标类型,若是则返回true,否则返回false。
5.5 实际意义
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程,带来不同的效果。
作业:
1.理解和掌握多态的案例代码。
2.编写五子棋游戏。
3.自定义矩形(Rect)类,特征有:横纵坐标、长度及宽度,要求实现封装并提供打印方法;
自定义圆形(Circle)类,特征有:横纵坐标、半径,要求实现封装并提供打印方法;
提取共性自定义图形(Shape)类。
自定义TestShape类,自定义成员方法实现既能打印矩形又能打印圆形的方法并调用。