引言:Java是一个支持双分派的单分派语言

知道java是支持后期动态绑定,也知道访问者模式,但是两者之间的关系,还真不知道,况且在这之间还有一个静态绑定。

1.动态绑定

class Father {
public void method(){
System.out.println("This is Father's method");
}
} class Son1 extends Father{
public void method(){
System.out.println("This is Son1's method");
}
} class Son2 extends Father{
public void method(){
System.out.println("This is Son2's method");
}
} public class Test {
public static void main(String[] args){
Father s1 = new Son1();
s1.method(); Father s2 = new Son2();
s2.method();
}
}

打印结果:

This is Son1′s method
This is Son2′s method

使用过java的,这上面的结果,都会不屑一顾。那么在看下面一个例子,反正我自己是傻眼了

2.静态绑定

class Father {
} class Son1 extends Father {
} class Son2 extends Father {
} class Execute {
public void method(Father father) {
System.out.println("This is Father's method");
} public void method(Son1 son) {
System.out.println("This is Son1's method");
} public void method(Son2 son) {
System.out.println("This is Son2's method");
}
}

很神奇的发现,打印了结果是这样

This is Father's method
This is Father's method
This is Father's method

对于重载,只是在编译的时候,就已经决定了。是根据申明对象来选择具体调用哪个重载的方法,因此才会全部调用父类的方法

当然,我们可以通过instanceof关键字来处理,但是这样,如果有较多子类,这样逻辑判断起来就会很别扭,而且没增加一个子类,都需要新增一个if else 否则,代码就会出现问题

这样,就明白了,引言说的,java是单派语言。那么如何理解,支持双派呢?答案在于java可以通过访问者模式来实现双派机制

首先,看下一个简单的例子

class Visitor_A {

    public void method1() {

        System.out.println("Visitor_A dosomething");
} public void method2(Visitor_B b) { b.callA(this); } } class Visitor_B { public void callA(Visitor_A a) { a.method1();
}
} public static void main(String[] args) { Visitor_A visitor_a = new Visitor_A();
Visitor_B visitor_B = new Visitor_B();
visitor_a.method1();
visitor_B.callA(visitor_a); }

上面,就是访问者模式的最基础形式,通过观察者B来访问A的接口,来实现双派能力,其实也是使用本质也是依赖了java的后期动态绑定机制能力

class Father {
public void accept(Execute exe){
exe.method(this);
}
}
class Son1 extends Father{
public void accept(Execute exe){
exe.method(this);
}
}
class Son2 extends Father{
public void accept(Execute exe){
exe.method(this);
}
} class Execute {
public void method(Father father){
System.out.println("This is Father's method");
} public void method(Son1 son){
System.out.println("This is Son1's method");
} public void method(Son2 son){
System.out.println("This is Son2's method");
}
} public class Test {
public static void main(String[] args){
Father father = new Father();
Father s1 = new Son1();
Father s2 = new Son2(); Execute exe = new Execute();
father.accept(exe);
s1.accept(exe);
s2.accept(exe);
}
}

想了解更多理论讨论,可以移步这里:http://www.iteye.com/topic/1130764

java单双派机制理解的更多相关文章

  1. Java ClassLoader加载机制理解 实际例子

    针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...

  2. Java ClassLoader加载机制理解

    今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...

  3. Java——单双引号的区别

    单引号: 单引号包括的是单个字符,表示的是char类型.例如: char  a='1' 双引号: 双引号可以包括0个或者多个字符,表示的是String类型. 例如: String s="ab ...

  4. java单双引号转义问题

    JavaScript代码:var str = '<a href="javascript:;" onclick="visaDetail(\'1\',' + value ...

  5. java——String、StringBuffer、StringBuilder、包装类、单双引号

    String: String是一个特殊的类,被定义为final类型,为字符串常量,同样的字符串在常量池中不能重复. 但是由于使用关键字new创建新的字符串,java会在对中分配新的空间,这样即使字符串 ...

  6. 【Java】深入理解Java中的spi机制

    深入理解Java中的spi机制 SPI全名为Service Provider Interface是JDK内置的一种服务提供发现机制,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用 ...

  7. 深入理解Java中的反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  8. Java单例和多例

    背景:最近在学习韩老师的笔记时候发现不是很了解单例和多例,于是通过网上查找资料的方式去学习. 设计模式:最佳的实践,是软件开发人员在软件开发过程中面临一般解决方案,也就是开发的经验总结. 单例模式(S ...

  9. java单例-积木系列

    一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档.   懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ...

随机推荐

  1. [Functional Programming] Using JS, FP approach with Arrow or State Monad

    Using Naive JS: const {modify, get} = require('crocks/State'); const K = require('crocks/combinators ...

  2. Robot Framework + Selenium library + IEDriver环境搭建

    转载:https://www.cnblogs.com/Ming8006/p/4998492.html#c.d 目录: 1 安装文件准备2 Robot框架结构3 环境搭建  3.1 安装Python  ...

  3. C#.NET常见问题(FAQ)-如何把定义存放类实例的数组

    数组存放的可以是普通的int,double,string类型,也可以是自定义的类的实例   如果数组长度未知,可以用list对象存放   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: h ...

  4. Swift语言精要 - 浅谈结构体(Struct)

    CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct). 那么结构体(Struct)到底是什么 ...

  5. 微信小程序 - 配置普通二维码跳小程序

    普通二维码跳小程序规则: https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html#%E5%8A%9F%E8%83%B ...

  6. C++ 第三课:常量转义字符

    常量转义字符 以下的转义字符使普通字符表示不同的意义. 转义字符 描述 \' 单引号 \" 双引号 \\ 反斜杠 \0 空字符 \a 响铃 \b 后退 \f 走纸 \n 换行 \r 回车 \ ...

  7. 栈的实现与操作(C语言实现)

    栈的定义  1, 栈是一种特殊的线性表  2,栈仅能在线性表的一端进行操作  3,栈顶(Top): 同意操作的一端 同意操作的一端  4,栈底(Bottom): ,不同意操作的一端 不同意操作 ...

  8. Python调用Windows外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  9. Android tree应用框架

    简单介绍 一个好的Android应用开发框架,能够加快Android开发速度,今天笔记基于很多开源项目自写了一款Android应用框架. 内容 框架包含:界面管理(Activity管理).数据库操作( ...

  10. SpringBoot之配置google kaptcha

    项目中引入POM: <dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId&g ...