一、面向对象特征之三:多态性
1、如何理解多态性?
理解:理解为一个事物的多种形态。
生活举例:
女朋友:我想养一个宠物。 孩子:我想要一个玩具。 老板:张秘书,安排一个技术科的同事,跟我一起下周出差。
2、Java中多态性的体现:
子类对象的多态性:父类的引用指向子类的对象。(或子类的对象赋给父类的引用) 比如:Person p2 = new Man();
3、多态性的应用:
多态性的应用:虚拟方法调用
在多态的场景下,调用方法时
编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法) 执行式,实际执行的是子类重写父类的方法。
简称为:编译看左边,运行看右边。
4、多态性的使用前提:① 要有类的继承关系 ② 要有方法的重写
5、多态的适用性:适用于方法,不适用于属性。
6.1、多态的好处与弊端
6.2 、好处:极大的减少了代码的冗余,不需要定义多个重载的方法。
7、instanceof的使用
-
-
建议在向下转型之前,使用instanceof进行判断,避免出现类型转换异常
-
-
-
格式: a instanceOf A : 判断对象a是否是类A的实例。
-
-
-
如果a instanceOf A 返回true,则:
a instanceOf superA 返回也是true。其中,A 是superA的子类。
-
二、Object类的概述
1、Object类的说明
明确:java.lang.Object 任何一个Java类(除Object类)都直接或间接的继承于Object类 Object类称为java类的根父类 Object类中声明的结构(属性、方法等)就具有通用性。 Object类中没有声明属性 Object类提供了一个空参的构造器 重点关注:Object类中声明的方法
2、常用方法
重点方法:equals() \ toString() 了解方法:clone() \ finalize() 目前不需要关注:getClass() \ hashCode() \ notify() \ notifyAll() \ wait() \ wait(xx) \ wait(xx,yy)
3、equals()的使用
3.1 、适用性: 任何引用数据类型都可以使用。
3.2 、java.lang.Object类中equals()的定义: public boolean equals(Object obj) { return (this == obj); }
3.3 、子类使用说明:
自定义的类在没有重写Object中equals()方法的情况下,调用的就是Object类中声明的equals(),比较两个对象的引用地址是否相同。(或比较两个对象是否指向了堆空间中的同一个对象实体)
对于像String、File、Date和包装类等,它们都重写了Object类中的equals()方法,用于比较两个对象的实体内容是否相等。
3.4 、开发中使用说明:
实际开发中,针对于自定义的类,常常会判断两个对象是否equals(),而此时主要是判断两个对象的属性值是否相等。 所以:我们要重写Object类的equals()方法。 如何重写: 手动自己实现 调用IDEA自动实现(推荐)
3.5 、高频面试题: 区分 == 和 equals()
==:运算符 ①使用范围:基本数据类型、引用数据类型 ② 基本数据类型:判断数据值是否相等
int i1 = 10; int i2 = 10; sout(i1 == i2);//true
char c1 = 'A'; int i3 = 65; sout(c1 == i3);//true
float f1 = 12.0F; int i4 = 12; sout(f1 == i4);//true
引用数据类型变量:比较两个引用变量的地址值是否相等。(或比较两个引用是否指向同一个对象实体)
equals():方法
使用范围:只能使用在引用数据类型上。 具体使用:对于类来说,重写equals()和不重写equals()的区别。
4、toString()的使用
4.1 、Object类中toString()的定义: public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
4.2、 开发中的使用场景
平时我们在调用System.out.println()打印对象引用变量时,其实就调用了对象的toString()
4.3 、子类使用说明:
自定义的类,在没有重写Object类的toString()的情况下,默认返回的是当前对象的地址值。像String、File、Date或包装类等Object的子类,它们都重写了Object类的toString(),在调用toString()时,返回当前对象的实体内容。
4.4 、开发中使用说明:
习惯上,开发中对于自定义的类在调用toString()时,也希望显示其对象的实体内容,而非地址值。这时候,就需要重写Object 类中的toString().