当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2014-09-10   作者:annan211   来源:转载   浏览次数:
摘要: Java 语言的静态多分派和动态单分派特性。 先来熟悉概念:    静态多分派:      静态分派 意思是 所有依赖静态类型来定位方法执行版本的分派过程就叫做静态分派,静态分派最典型的应用就是方法重载。    动态单分派:      动态单分派 意思是 根据运行期实际
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 语言的静态多分派和动态单分派 的特性

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
最近一直在学习Android里面的事件分派机制,感觉很奇妙,看了很多博客和分析,才在脑子里形成了一个
前言 由于工作需要,这几天学了一点MFC,在AFX里看到很多熟悉的东西,如类型信息,序列化,窗口封装
前言 由于工作需要,这几天学了一点MFC,在AFX里看到很多熟悉的东西,如类型信息,序列化,窗口封装
作者:zuoxiaolong8810(左潇龙),转载请注明出处。 本次LZ和各位分享一下访问者模式,从场景、设
任何系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统
昨天发的帖只是提到了单一分派(single-dispatch)和多分派(multiple-dispatch),没有说明它们到底
参考文献地址: http://gurudk.iteye.com/blog/322753 分派过程就是确定一个方法调用的过程,双分派
(本文原作于2006.03.14,第一次修正于2006.06.06,修正后适用于ESFramework V0.3+) 本来Tcp/udp组
一、代理概念 为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父
本文动态代理部分内容大量引自: http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 一、代理
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号