JavaSE - 多态的本质
时间:2022-07-22
本文章向大家介绍JavaSE - 多态的本质,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多态
**场景:**创建一个Animal类,有Dog和Cat类继承Animal类,并重写say( )方法,创建一个Woman类,该类有个Animal类型的成员变量和一个pet( )方法调用对应的say( )方法
package com.sukai.test01;
/**
* 实现多态
*/
public class Animal {
public static void main(String[] args) {
Woman womanA = new Woman(new Cat());
womanA.Pet();
Woman womanB = new Woman(new Dog());
womanB.Pet();
Woman womanC = new Woman(new Animal());
womanC.Pet();
}
public void say() {
System.out.println("I am a animal");
}
}
class Dog extends Animal {
@Override
public void say() {
System.out.println("I am a dog");
}
}
class Cat extends Animal {
@Override
public void say() {
System.out.println("I am a cat");
}
}
class Woman {
private Animal animal;
Woman(Animal animal) {
this.animal = animal;
}
public void Pet() {
animal.say();
}
}
经发现,womanA.Pet();
本质上调用的是运行时类的say()
方法而不是引用类型的say()
探究多态的本质 - 动态绑定
Human human = new Man();
虽然我们new的对象是一个Man()
但是它调用的却是Animal()
的Say()
方法
package com.sukai.test01;
public class Human {
public static void main(String[] args) {
Human human = new Man();
human.Say();
}
public void Say() {
System.out.println("I am a human");
}
}
class Man extends Human {
@Override
public void Say() {
System.out.println("I am a man");
}
}
内存分析:
如图所示,首先在栈中创建一个变量,它指向Man这个对象,但是由于在调用构造方法时,是把human当成一个Human对象的引用传过来的,所以human只能指向Man对象里面的Human对象,那么现在我们调用human.say()
,它就回去代码区中找say( )方法,现在它发现有两个Say( ),那么要调用哪一个呢?此时实际上在父类的内部有一个指向Say( )方法的指针,在程序运行期间,你new的是哪个对象,指针就指向哪个对象的Say( )方法,这就是动态绑定,通过这种动态绑定的方式就可以实现多态了
总结
总结动态绑定(多态):动态绑定是指在“执行期间”(而非编译期间)判断所引用的实际对象类型,根据其实际的类型调用其相应的方法
- 将Keras权值保存为动画视频,更好地了解模型是如何学习的
- TensorFlow:如何通过声音识别追踪蝙蝠
- Python机器学习的练习四:多元逻辑回归
- Python机器学习的练习三:逻辑回归
- 什么?!只用30行代码就能创建一个JavaScript的神经网络?
- ChainerCV: 一个用于深度学习的计算机视觉库
- 以太坊·食品溯源案例
- 以太坊·单机多实例演示
- OpenAI-人工反馈的深度学习
- 以太坊·将数据写入到区块链中
- 如何使用Faster R-CNN来计算对象个数
- hyperledger v1.0.5 区块链运维入门
- 在TensorBoard中使用t-SNE实现TensorFlow自动编码器的可视化嵌入
- 以太坊智能合约开发入门
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释