文章插图
原力计划本文将会带你了解行为方法分派,从而帮助你在行为分派时进行一些功能操作 。具体将会讲解行为分派的类型:静态 & 动态行为分派,希望对大家有帮助 。
作者 | Carson_Ho
本文系CSDN博文
知识储备
分派
定义:确定执行哪个方法的过程 。
有些读者会问,方法的执行不是取决于代码设置中的执行对象吗?为什么还要选择呢?答案是,若一个对象对应于多个方法时,就需要进行选择 。
读者应该都想到了Java中的特性:多态,即重写 & 重载 。
此外还有分类,分类包括静态分派 & 动态分派 。下面我将详细讲解 。
变量的静态类型 & 动态类型
先看下面的代码
public class Test {
static abstract class Human {
}
static class Man extends Human {
}
static class Woman extends Human {
【原力计划】}
// 执行代码
public static void main(String[] args) {
Human man = new Man;
// 变量man的静态类型 = 引用类型 = Human:不会被改变、在编译器可知
// 变量man的动态类型 = 实例对象类型 = Man:会变化、在运行期才可知
}
}
即:
变量的静态类型 = 引用类型 :不会被改变、在编译器可知
变量的动态类型 = 实例对象类型 :会变化、在运行期才可知
下面 , 我将详细讲解Java中的分派类型:静态分派 & 动态分派
静态分派
定义
根据变量的静态类型,进行方法分派的行为,即根据变量的静态类型,确定执行哪个方法 。这一般发生在编译期,所以不由 Java 虚拟机来执行 。
应用场景:方法重载(OverLoad)
实例说明:
public class Test {
// 类定义
static abstract class Human {
}
// 继承自抽象类Human
static class Man extends Human {
}
static class Woman extends Human {
}
// 可供重载的方法
public void sayHello(Human guy) {
System.out.println(\"hello,guy!\");
}
public void sayHello(Man guy) {
System.out.println(\"hello gentleman!\");
}
public void sayHello(Woman guy) {
System.out.println(\"hello lady!\");
}
// 测试代码
public static void main(String[] args) {
Human man = new Man;
Human woman = new Woman;
Test test = new Test;
test.sayHello(man);
test.sayHello(woman);
}
}
// 运行结果
hello,guy!
hello,guy!
根据上述的讲解 , 大家应该明白运行结果的原因:
方法重载(OverLoad) = 静态分派 = 根据变量的静态类型确定执行(重载)哪个方法 。
所以上述的方法执行时 , 是根据变量(Man、Woman)的静态类型(Human)确定重载sayHello中参数为Human guy的方法,即sayHello(Human guy)
特别注意变量的静态类型发生变化的情况,遇到这种情况时,可通过强制类型转换改变变量的静态类型 。
Human man = new Man;
test.sayHello((Man)man);
// 强制类型转换
// 此时man的静态类型从 Human 变为 Man
// 所以会调用sayHello中参数为Man guy的方法,即sayHello(Man guy)
静态分派的优先级匹配问题问题描述:
1、背景
现需要进行静态分派 。
2、问题
程序中没有显示指定静态类型 。
3、解决方案
程序会根据静态类型的优先级,从而选择优先的静态类型进行方法分配 。
实例说明
public class Overload {
private static void sayHello(char arg){
相关经验推荐
- 正常水压是多少mpa
- 水果种类
- 德牧多大开始叫
- 浙江面积 浙江面积排名
- 身体如何护肤呢
- 吴哥窟在哪个国家 吴哥窟的简介
- 疯狂的贤妻
- 白帝城位于 白帝城的简介
- 洛阳牡丹开花时间 洛阳牡丹开花时间介绍
- 华为nova7开发者选项在哪