`
annan211
  • 浏览: 444862 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 语言的静态多分派和动态单分派 的特性

    博客分类:
  • jvm
 
阅读更多
Java 语言的静态多分派和动态单分派特性。

先来熟悉概念:
   静态多分派:
     静态分派 意思是 所有依赖静态类型来定位方法执行版本的分派过程就叫做静态分派,静态分派最典型的应用就是方法重载。
   动态单分派:
     动态单分派 意思是 根据运行期实际类型确定方法执行版本的分派过程叫做动态分派,动态分派最典型的应用就是方法重写。
 

    再来看看单分派和多分派

    单分派: 就是说 依据只有一个
    多分派:就是说 依据可以有多个


   那Java里面的静态多分派 意思就是,依赖静态类型来确定方法执行版本的时候,可以依据多个证据。
   举个例子:
 
  
     public class Loder {

	public static void fu(char a){
		System.out.println("char");
	}

	public static void fu(int a){
		System.out.println("int");
	}

	public static void fu(long a){
		System.out.println("long");
	}

	public static void fu(float a){
		System.out.println("float");
	}

	public static void fu(double a){
		System.out.println("double");
	}
	public static void main(String[] args) {
		fu('a');
	}
         
         public static void fu(Character a){
		System.out.println("Character ");
	}

         public static void fu(char ... a){
		System.out.println("...");
	}

         public static void fu(Sezrizable a){
		System.out.println("Sezrizable ");
	} 

         public static void fu(Object a){
		System.out.println("Object ");
	} 
}
   


上面这段代码 输出的时候 如果存在char 参数,就输出char,如果不存在char参数,就先转为int 输出int,以此类推,会以此输出 long float double,Character , Sezrizable ,Object , ...

可以看出 多参数的优先级最低,输出 Sezrizable 是因为 其类型实现了 Sezrizable  接口

静态方法是在类加载期就进行编译,方法执行版本的选择也是静态分派进行的。依据也不是唯一的。



  动态单分派  简单点就是  运行时根据确切的类型来确定执行方法的版本,而且依据是唯一的。


 
public class DynamicDisplay {

	public static void main(String[] args) {

		QQ q = new QQ();
		PP p = new PP();

		B b = new BB();
		B b2 = new B();
		b.dd(q);
		b2.dd(p);
	}

	static class BB extends B{
		public void dd(QQ a){
			System.out.println("BB--BB");
		}

		public void dd(PP a){
			System.out.println("PP--PP");
		}
	}
}


class B{
	public void dd(QQ q){
		System.out.println("QQQQ");
	}

	public void dd(PP q){
		System.out.println("PPPP");
	}
}

class QQ{

}
class PP{

}

  


编译器在编译期间 存在静态分派的过程,在确定执行的方法版本的时候 存在两个依据,一个是 方法参数的类型,一个是 父类的类型。

很明显  输出的 是根据 new 出来的是哪个对象  就调用哪个对象的方法,也就是说编译器忽略了参数的类型的影响,唯一存在影响的是 此方法的接收类型,因为这是动态单分派呀,我日。 
分享到:
评论

相关推荐

    Java的动态分派和静态分派的实现

    主要介绍了Java的动态分派和静态分派的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    【深入Java虚拟机(5)】多态性实现机制-静态分派与动

    【深入Java虚拟机(5)】多态性实现机制——静态分派与动态分派编程开发技术共5页.pdf.zip

    Java的动态绑定与双分派_动力节点Java学院整理

    主要介绍了Java的动态绑定与双分派,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java程序设计案例教程-第8章-多线程编程.pptx

    本章将详细介绍Java语言的多线程技术。通过本章的学习,读者应该理解线程和进程的区别,掌握Java的多线程编程技术,了解线程的同步和线程间通信等内容。 第2页 Java程序设计案例教程-第8章-多线程编程全文共36页,...

    static-dispatch:Common Lisp的静态泛型函数分派

    静态分派的目的是在通常的动态分派太慢并且不需要通用函数的动态功能(例如在运行时添加/删除方法)的情况下提供优化。 这种情况的一个例子是通用相等性比较函数。 当前,当在数字代码中大量使用泛型函数时,泛型...

    java 面试题 总结

    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数...

    Java多线程编程的Java中的线程.docx

    线程是进程中可独立执行的最小单位,它也是处理器进行独立调度和分派的基本单位。一个进程可以包含多个线程,每个线程执行自己的任务,同一个进程中的所有线程共享该进程中的资源,如内存空间、文件句柄等。

    Stalemate:对整个JRE进行静态分析以预测死锁漏洞

    赞成:因为它减少了“同步”语句块,而过程:因为它减少了Java的动态分派功能。 ProceduralAnalysis包含以下各项的实现,文档和输出:对整个JRE进行过程静态分析以预测死锁利用。 程序性的:因为它打折了Java的...

    超级有影响力霸气的Java面试题大全文档

     方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第101节方法调用-静态分派调用00:16:21分钟 | 第102节方法调用-动态分派调用00:09:02分钟 | 第103节动态类型语言支持00:09:27分钟 | 第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟

    安卓java读取网页源码-interview:安卓面试

    静态属性和静态方法是否可以被继承?是否可以被重写?为什么? 什么是内部类?内部类、静态内部类、局部内部类和匿名内部类的区别及作用? == 和 equals() 和 hashCode() 的区别? Integer 和 int 之间的区别? ...

    【JVM和性能优化】3.JVM的执行子系统

    文章目录Class 文件格式字节码Class类的本质Class文件格式类加载机制加载验证准备解析初始化类加载器双亲委派机制栈桢JVM方法调用详解方法解析静态分派动态分派参考 Class 文件格式 一般情况下Java代码执行流程如下...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第101讲 方法调用-静态分派调用 00:16:21  第102讲 方法调用-动态分派调用 00:09:02  第103讲 动态类型语言支持 00:09:27  第104讲 字节码执行引擎小结 00:03:38  第105讲 总结与回顾 00:10:55  第106...

    基于maven项目的SSM框架与layu前端框架的代码

    OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从...

    二十三种设计模式【PDF版】

    会 Java 的人越来越多,但是一直徘徊在语言层次的程序员不在少数,真正掌握 Java 中接口或抽象类的应用不是很多,大家 经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 ...

    net学习笔记及其他代码应用

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形...

Global site tag (gtag.js) - Google Analytics