1. 第九天回顾
继承:类和类的关系。单继承,多层继承
成员变量,方法有,就方法,方法没有,子类成员,父类成员
this本类成员,super父类成员
成员方法,覆盖,重写,会写覆盖,复制父类方法,粘贴到子类中
构造方法,子类所有构造器,第一行默认super() 访问父类空参数构造方法
如果父类多个构造器,子类任选一个方法。父类没有空参数,子类必须手写super(参数),访问父类有参数构造。第一个无论是this,还是super选一个,保证构造方法直接或者间接访问父类构造方法。
多态, 父类和子类之间的关系的用法 父类引用 = 子类对象,无限扩展子类,运行的方法都是子类重写后的,成员变量运行是父类。多态中,只能使用子类父类共有成员。
final 成员,构造器,构造代码块,一次 成员都是定义的时候直接就赋值了
2. 第十天的学习内容,宠物案例,类型转换异常,多态中的转型,比较运算符 instanceof,多态中的细节--结论。抽象类 抽象方法,定义和使用方式
3. 多态中的类型转换
父类 = 子类 类型的转换,自动类型提升,两边数据类型做到统一,小的转向大的。 子类转成父类类型,才能赋值。调用子类的特有内容,类型的强制转换!!
类型转换异常 ClassCastException ,进行强制转型的时候,数据类型无法做运转。一旦发生,后面所有程序终止运行。
避免异常发生,必须对变量a进行判断,a接收的到底是Cat类型,还是Dog类型
如果是Cat类型,转成Cat,如果是Dog类型,转成、Dog
使用比较运算符instancof完成这个功能。判断一个引用,是不是指向一个对象:判断出来a到底是猫,还是狗
instanceof 运行结果是布尔值 引用类型 instanceof 类
if(a instanceof Cat) 判断a引用,是不是指向Cat对象,如果是返回真
4. 多态的细节
为什么多态中,有的运行子类,有的运行父类,有的情况还是编译失败
存在于多态中, 父类 = new 子类()
l 成员变量,编译时期看引用类型中,有没有这个变量,有编译成功,否则编译失败
l 成员变量,运行时期,运行的是引用变量所属的类的结果
l 非静态成员方法,编译时期看引用类型中,有没有这个方法,有编译成功,否则编译失败
l 非静态成员方法,运行时期,运行子类重写后的方法
l 静态成员变量,编译时期看引用类型中,有没有这个变量,有编译成功,否则编译失败
l 静态成员变量,运行时期,运行的是引用变量所属的类的结果
l 静态成员方法,编译时期,看引用类型中,有没有这个方法,有编译成功,否则编译失败
l 静态成员方法,运行时期,运行的是引用型变量所属的类中的静态方法
l 简单记法:除了非静态成员方法以外,编译看父类,运行看父类,只有非静态的成员方法,编译看父类,运行看子类
l 编译看左边,运行看右边 Fu f = newZi()非静态成员方法
l 编译看左边,运行看左边 Fu f = newZi()除了非静态成员方法
JVM有动态绑定和静态绑定机制,多态中的机制,除了非静态的成员方法以外,JVM都会静态的绑定在父类的引用中,只有在运行非静态的成员方法,JVM会动态的绑定到子类的对象中。
5. 抽象类
抽象方法:说不清楚,讲不明白,定义个方法的时候,发现方法没有实际的意义,没有实现,没有逻辑(Animal 吃什么),使用抽象方法。
新的关键字abstract , 没有大括号,没有方法体,根本不能运行。
抽象方法,必须存在于抽象类中,因此,类必须用abstract修饰
抽象类的用法:
抽象类不能实例化对象,不能区new 一个抽象类
需要子类继承抽象类,重写抽象方法,建立子类的对象
抽象类继承上的细节:
如果子类继承后,只重写了部分抽象方法,或者没重写抽象方法,子类还是一个抽象类.
抽象类,强制子类重写抽象方法
6. 抽象类的自身特点:
l 抽象类有没有构造方法,肯定有,第一行默认super
l 抽象类中,有没有普通方法,非抽象方法,可以有,子类继承后直接使用
l 抽象类中,有没有静态普通方法,可以有,类名直接调用
l 抽象类中,可不可以没有抽象方法,,可以没有。真的没有抽想法,能建立对象吗,不可以建立对象,类是抽象的,不可以创建对象
7. abstract和哪些修饰符不能并存,为什么
l private,抽象就是为了子类重写,私有权限,子类无法继承和重写
l final,抽象就是为了子类重写,final修饰,方法不能被重写
l static,可以直接类名调用,抽象没有方法体
8. 设计模式
什么是设计模式:人们用程序解决现实中问题的一种思维方法。Java中的所有设计模式,基于面向对象思想。一共有23种设计模式:模板方法,单例,适配器,装饰。(工厂模式,工厂方法,抽象工厂,享元,中介者,观察者,命令,桥梁)
要求:
计算程序的执行时间,1000次for循环。开始前记录一个时间,结束的时候记录一个时间。两个时间相减。
class System{
public staticlong currentTimeMillis(){}
}
long 变量 = System. currentTimeMillis();
返回自 1970年1月1日午夜零时,到方法运行的那个时刻,所经过的毫秒值
1000毫秒=1秒
统计While 1000次.for也是1000次,统计什么,不确定.
不确定的代码,封装成了另一个方法,调用就可以了。但是问题还是没处理,
code方法中的代码是不确定,而getTime方法是不变的。将变化的内容,对外暴露出去,自己不实现,等待子类实现.
引用领域:如果你去实现一个功能,发现功能一部分清楚,一部分不清楚,不清楚的部分写成抽象方法,等待子类重写实现--模板方法设计模式