- 1.多态
- 2.对象的多态
- 3.向上转型
- 4.向下转型
- 5.属性无多态之说
- 6.动态绑定机制
- 7.多态数组
- 8.多态参数
- 9.object类详解之equals方法
- 10.object类详解之hashcode方法
- 11.object类详解之toString方法
- 12.object类详解之finalize方法
(1)能提高复用性
(2)重写与重载体现多态性
前提:两个对象(类)存在继承关系
(1)一个对象的编译类型与运行类型可以不一致
eg. A为B的父类 A a = new B ( ) ; 其中编译类型为A ,运行类型为B
(2)编译类型在定义对象时候就确定了,不会变
(3)运行类型是可以改变的
(4)= 左边为编译类型 = 右边为运行类型
(1)父类的引用指向子类的对象
(2)在权限范围内,可以调用父类所有成员
(3)不能调用子类的特有成员
(4)运行时看运行类型,遵循就近原则
(1)将父类引用强制转成子类引用
(2)只能强转父类引用,不能强转父类对象
(3)只能强转父类引用的前提:父类一开始就指向某一个子类对象
(4)只能强转父类引用的结果:转型后可以调用子类的所有成员
(1)属性的值直接看编译类型
(2)a instanceof b 判断a的运行类型是否为b的运行类型,或者判断a的运行类型是否为b的运行类型的子类型
(1)当调用对象方法时,该方法会和该对象的内存地址(运行类型)绑定
(2)调用对象属性时,没有动态绑定机制,哪里声明属性,哪里就调用属性
(1)数组的定义类型为父类类型,而里面保存的实际元素类型为子类类型。
eg. A为B,C类的父类,A[ ] a = new A[ ] ;
a [0] = new A(xxx) ;a[1] = new B(xxx) ;a[2] = new C(xxx) ;
(2)多态数组常与:类型判断instanceof,向下转型相结合
8.多态参数方法定义时,允许形参为父类类型,实参为子类类型。
多态的练习题
(1)==
可判断基本数据类型(判断值),引用数据类型(判断地址值)。
(2)equals
若在object类中,只能判断引用类型,即地址值是否一样;
若在子类中重写。如String类,Integer类,用于判断内存值是否一样。
(1)提高哈希表性能
(2)若引用指向同一对象,则哈希值一样;反正不一样。
(3)哈希值根据地址值而来,但是不能将哈希值等同于地址值。
(4)在集合中可以重写
(1)在object类中:
返回:包名 + 表名 + @ + 十六进制的哈希值
(2)在子类中:
重写该方法,是为了打印对象属性信息。
有默认形式,快捷键 alt + insert -> toString()
(3)输出对象时,toString默认被调用
12.object类详解之finalize方法即:a为A类的对象 ,以下两种情况等价
System.out.println(a);
System.out.println(a.toString);
(1)在object类中:
当某个对象不存在引用时,由对象的垃圾回收器调用该方法把对象在堆中的空间释放。
(2)在子类中:
重写后,可以做一些资源释放操作,例如:数据库连接,打开文件。
有默认形式,快捷键 alt + insert -> finalize()
(3)垃圾回收机制由系统调用,有自己的GC算法来决定触发的阶段;人为可以主动触发回收机制,用System.gc( ) ;
object类的练习题
equals方法的重写
部分图片来自B站韩顺平老师



