java-OOP:面向对象之多态

112 阅读2分钟

java-OOP:面向对象之多态

1、概念

父类引用指向子类对象

要点:

  1. 一个对象的编译类型和运行类型可以不一致
  2. 编译类型在定义对象时,就确定 了,不能改变
  3. 运行类型是可以变化的
  4. 编译类型看定义时 = 号左边,运行类型看 = 号右边
Animal a =  new Dog();

2、在多态过程中会发生向上转型

  • 因为在编译阶段,能调用哪儿些成员是由编译类型决定的。
  • 父类不能调用子类的特有方法

父类不能调用子类的特有方法.png

2.1 如何解决这个问题:向下转型

  • 子类引用指向父类引用,父类引用需要强转为子类类型

  • 子类类型 引用名 = (子类类型) 父类引用

  • 要去父类的引用必须指向的是当前目标类型的对象

  • 可以调用子类类型中所有的成员

tostring的理解

如果类没有重写tostring,那么重写的是object的tostring方法

tostring底层就是把对象的hashcode值转换成十进制,哈希code值是根据地址换成出来的一个数字

object类中的tostring.png

finalize类的理解

  1. 当对象被回收时,系统自动调用该对象的 finalize 方法。
  2. 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来 销毁该对象,在销毁该对象前,会先调用 finalize 方法
  3. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制。
  4. 开发中不会手动调用,不会使用,主要应付面试,知道就好

类方法(静态方法)

静态方法只能访问静态成员或静态方法,静态的只能访问静态的

main方法的理解

main方法是jvm虚拟机自动调用

代码快

静态代码块:类加载的时候,或者创建对象时隐式调用

普通代码块:在创建对象实例的时候,会被隐式的调用,创建一次,调用一次,如果只是是哟给你类的静态成员时,普通代码块并不会执行

类什么时候加载

  1. new 创建实例
  2. 创建子类对象实例时,父类会被加载(父类先加载子类后加载)
  3. 使用类的静态成员时(静态属性,静态方法)

代码块的加载顺序

代码块的执行顺序.png 构造器先被调用,之后调用普通代码块