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();   //主动调用垃圾回收器

 

 

 

------------恢复内容结束------------

posted @ 2021-09-26 17:14  Shawn_T  阅读(26)  评论(0)    收藏  举报