java-OOP:面向对象之多态
1、概念
父类引用指向子类对象
要点:
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时,就确定 了,不能改变
- 运行类型是可以变化的
- 编译类型看定义时 = 号左边,运行类型看 = 号右边
Animal a = new Dog();
2、在多态过程中会发生向上转型
- 因为在编译阶段,能调用哪儿些成员是由编译类型决定的。
- 父类不能调用子类的特有方法
2.1 如何解决这个问题:向下转型
-
子类引用指向父类引用,父类引用需要强转为子类类型
-
子类类型 引用名 = (子类类型) 父类引用
-
要去父类的引用必须指向的是当前目标类型的对象
-
可以调用子类类型中所有的成员
tostring的理解
如果类没有重写tostring,那么重写的是object的tostring方法
tostring底层就是把对象的hashcode值转换成十进制,哈希code值是根据地址换成出来的一个数字
finalize类的理解
- 当对象被回收时,系统自动调用该对象的 finalize 方法。
- 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来 销毁该对象,在销毁该对象前,会先调用 finalize 方法
- 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制。
- 开发中不会手动调用,不会使用,主要应付面试,知道就好
类方法(静态方法)
静态方法只能访问静态成员或静态方法,静态的只能访问静态的
main方法的理解
main方法是jvm虚拟机自动调用
代码快
静态代码块:类加载的时候,或者创建对象时隐式调用
普通代码块:在创建对象实例的时候,会被隐式的调用,创建一次,调用一次,如果只是是哟给你类的静态成员时,普通代码块并不会执行
类什么时候加载
- new 创建实例
- 创建子类对象实例时,父类会被加载(父类先加载子类后加载)
- 使用类的静态成员时(静态属性,静态方法)
代码块的加载顺序
构造器先被调用,之后调用普通代码块