2.从过程上来看
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的构造器,直到调用了java.lang.Object类中空参的构造器为止,正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用 。
明确,虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建了一个对象,即为new的子类对象
面向对象特征之三:多态理解多态性:可以理解为一个事物的多种形态
父类的引用指向子类的对象
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法————虚拟方法调用
虚拟方法调用(多态情况下)
子类中定义了与父类同名同参数的方法,在多态情况下,将此时 父类的方法 称为 虚拟方法 ,父类根据赋给它的不同子类对象,动态调用属于子类的该方法 。这样的方法调用在编译期是无法确定的 。(编译看左,运行看右)
多态是编译时行为还是运行时行为?
运行时行为
- 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
- 总结:编译看左,运行看右,new谁执行谁
- 多态性使用前提:类的继承关系,方法的重写
- 为什么要有多态性?:
- 对象的多态性,只适用于方法,不适用于属性属性的值(编译和运行都看左边)
1.实现代码的通用性
2.Object类中定义的public boolean equals(object obj){ }
JDBC:使用java程序操作(获取数据库连接、CRUD)数据库(MySQL、oracle、DB2、sQL Server)
3.抽象类、接口的使用肯定体现了多态性 。(抽象类、接口不能实例化)
向上转型:(引用是父类,对象是子类)-- 多态;
向下转型:(引用 子类,对象 子类) – 本态,
多态性只针对虚拟方法调用(普通方法)
为什么使用向下转型:
- 有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法 。子类特有的属性和方法不能调用
- 如何才能调用子类特有的属性和方法?
- 向下转型:使用强制类型转换符
Person p2 = new Man(); //使用强转时,有可能出现类型转换异常 Man m1 = (Man)p2;
使用强转时,可能出现classCastException的异常 。
为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型 。如果返回false,不进行向下转型 。
Instanceof关键字的使用a instanceof A:判断 对象a 是否是 类A 的实例 。如果是,返回true;如果不是,返回false 。
使用情景:为了避免在向下转型时出现类型转换异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型 。如果返回false,不进行向下转型 。
如果a instanceof A 返回true,则a instanceof B 也返回true 。其只,类B是类A的父类
要求a所属的类与类A必须是子类和父类的关系,否则编译错误 。
文章插图
文章插图
1.多态练习——重写方法
文章插图
文章插图
文章插图
java.lang.object类1.object类是所有Java类的根父类
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.object类
3.object类中的功能(属性、方法)就具有通用性 。
属性:无
方法: equals() / tostring() / getclass() /hashcode() / clone() / finalize()
wait() 、 notify( )、notifyAll()
- Object类只声明了一个空参的构造器
文章插图
推荐阅读
- 非常实用的 Python 库,推一次火一次
- App制作的流程是什么?如何制作App开发流程?
- Python中的菜单驱动程序
- 从啃PS到啃C4D,我的动态设计之路
- 国企岗位推荐,程序员求职速来看
- 小种红茶简介,红茶的种类价格
- 川红茶真假,川宁红茶种类
- 红茶的种类及产地,红茶的种类及特征
- windows cmd 环境下载文件的几种方法
- 红茶的种类功效,泡红茶种类