Day 11
------------恢复内容开始------------
多态:
前提: 两个对象(类) 存在继承关系!!
分为 方法的多态, 和 对象的多态
方法的重载和重写就体现多态
对象的多态:父类的引用 指向 子类对象
1. 对象的编译类型和运行类型 可以 不一致。(左边是编译类型, 右边是运行类型)
2. 编译类型在定义对象时就确定了,不能再改变
3. 运行类型 是可以改变的!
向上转型:
本质: 父类的引用指向子类的对象
Animal animal = new Cat();
可以调用父类的所有成员(需遵守访问权限)
但是不能调用子类的特有方法, 因为能调用哪些成员,是由编译器决定的,所以由编译类型决定!!
最终运行效果看 子类的实现, 即 调用方法时,是从子类开始查找方法,然后调用, 规则和前面的方法调用规则相同(从下往上找)
向下转型:
Cat cat = (Cat) animal;
注意: 堆中的真实对象是不能改的,创建时new出来的对象是什么就是什么。比如: animal 在创建时 指向了Cat, 那么就不能把它强转成Dog!
向下转型后, 编译类型 和 运行类型都是Cat
属性没有之说,所以只看编译类型!! 调用方法时,是从运行类型开始找的!!
instanceOf 用于判断对象的运行类型是否为XX类型或者XX类型的子类型
动态绑定机制:
1. 当调用对象方法的时候,该方法会和该对象的运行类型/内存地址 绑定
如: A 是 B的父类, A a = new B(); a.sum(); // sum() 方法只有父类中有 class A { sum(){ return getI();}} //子类和父类都有getI方法. 那么根据动态绑定机制, 这里会调用的是子类的getI 方法,而不是父类的getI 方法!
2. 当调用属性时, 属性没有动态绑定机制, 哪里调用,哪里使用!
==: 比较操作符
比较基本数据类型的 值, 比较引用数据类型的 地址
Object类中 equals() 方法, 只能判断引用类型,判断地址是否相等,但是子类往往会重写该方法!
比如 String, Integer 类就重写了equals方法,来比较值是否相等,而不是比较地址值!
注意:
Person p1 = new Person();
Person p2 = new Person();
sout(p1.equals(p2)); // false!!
hashcode()方法:
1. 提高具有哈希结构的容器的效率
2. 如果两个引用,指向同一个对象,则哈希值肯定相同!
3. 如果两个引用,指向不同的对象,则哈希值大概率是不同的!
4.哈希值是 地址值 经过哈希函数 运算后得出来的, 所以哈希值不是地址值
toString();
默认返回: 全类名(运行类型) + @ + 哈希值的十六进制
当直接输出一个对象时, 默认就是调用toString()方法
finalize();
当垃圾回收器认为没有对该对象的引用了,垃圾回收器会自动调用finalize()方法。
System.gc(); //主动调用垃圾回收器
------------恢复内容结束------------

浙公网安备 33010602011771号