`
idealab
  • 浏览: 195514 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java动态绑定探讨

    博客分类:
  • Java
阅读更多
本文转 “子 孑” 博客:http://zhangjunhd.blog.51cto.com/113473/49452

运行时绑定也叫动态绑定,它是一种调用对象方法的机制。Java调用对象方法时,一般采用运行时绑定机制。
1.Java的方法调用过程
编译器查看对象的声明类型和方法名(对象变量的声明类型)。通过声明类型找到方法列表。
编译器查看调用方法时提供的参数类型。
如果方法是private、static、final或者构造器,编译器就可以确定调用那个方法。这是静态绑定。
如果不是上述情况,就要使用运行时(动态)绑定。在程序运行时,采用动态绑定意味着:虚拟机将调用对象实际类型所限定的方法。
2.运行时(动态)绑定的过程
虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法。
注意,这里说的是对象的实际类型。即在多态的情况下,虚拟机可以找到所运行对象的真正类型。
3.在向上转型情况下的动态绑定示例
public class Father {
    public void method() {
       System.out.println("父类方法,对象类型:" + this.getClass());
    }
}
 
public class Son extends Father {
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       sample.method();
    }
}

结果1:
父类方法,对象类型:class samples.Son

这个结果没有疑问,声明的是父类的引用(句柄),但准确的调用了子类的对象,调用method,在子类中没有该方法,所以去父类中寻找到并调用之。
现在修改子类,重写(override)method方法。
public class Son extends Father {
    public void method() {
       System.out.println("子类方法,对象类型:" + this.getClass());
    }
   
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       sample.method();
    }
}

结果2:
子类方法,对象类型:class samples.Son

这个结果也是意料之中的。调用method时,在子类中寻找到了该方法,所以直接调用之。
4.静态绑定成员变量
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性还是父类的属性。
现在再进一步变化,在父类和子类中同时定义和赋值同名的成员变量name,并试图输出该变量的值。
public class Father {
    protected String name="父亲属性";
   
    public void method() {
       System.out.println("父类方法,对象类型:" + this.getClass());
    }
}
 
public class Son extends Father {
    protected String name="儿子属性";
   
    public void method() {
       System.out.println("子类方法,对象类型:" + this.getClass());
    }
   
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       System.out.println("调用的成员:"+sample.name);
    }
}

结果3:
调用的成员:父亲属性

这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。
现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。
public class Father {
    protected String name = "父亲属性";
 
    public String getName() {
       return name;
    }
 
    public void method() {
       System.out.println("父类方法,对象类型:" + this.getClass());
    }
}
 
public class Son extends Father {
    protected String name="儿子属性";
   
    public String getName() {
       return name;
    }
   
    public void method() {
       System.out.println("子类方法,对象类型:" + this.getClass());
    }
   
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       System.out.println("调用的成员:"+sample.getName());
    }
}

结果4:
调用的成员:儿子属性
分享到:
评论
1 楼 C_J 2009-04-20  
在讨论那个绑定的时候

我觉得我忽略了 new Son() 时候是先构造父类的  呵呵  不过不影响我们讨论的大致结果

相关推荐

    JAVA基础课程讲义

    动态绑定 77 多态的使用要点 78 对象的转型(casting) 79 final 81 抽象类 82 抽象类的使用要点 83 接口 83 为什么需要接口? 84 如何定义接口? 84 接口的本质探讨 84 接口使用要点 85 接口的多继承 86 面向接口编程 ...

    Java编程思想(完整版)

    1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 ...

    超爽的自学课件(java)

    一般情况下,我们需要有意忽略一个对象的准确类型,让Java的动态绑定机制(多形性)为那一类型实现正确的行为。但在某些场合下,对于只有一个基础句柄的对象,我们仍然特别有必要了解它的准确类型是什么。拥有这个...

    VC/Cshap/java源码大全

    EJB编程,VC++下ACE开发入门,ASP.NET中实现DataGrid控件动态绑定数据的方法探讨,模仿深度剥离效果,C#中动态数组设计原理,基于WinSock的UDP数据转发,用VC++实现手机短消息查询,基于.NET框架RijndaelManaged类...

    详解ASP.NET Core MVC四种枚举绑定方式

    本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满满的干货,你值得拥有。 探讨枚举...

    基于Java的飞机票订票系统的设计与实现.docx

    本文旨在探讨基于Java的机票订票系统的设计与实现,主要包括系统分析、系统设计、系统实现、系统测试等内容。本文将介绍研究背景和意义、所用技术介绍等方面,以及系统分析、系统设计、系统实现、系统测试等具体内容...

    javascript闭包传参和事件的循环绑定示例探讨

    今天看到一个javascript的题目,按常理循环绑定事件,但是得到的结果却不是想要的。 代码如下: <a>text</a> <a>link</a> [removed] var as = document.getElementsByTagName(‘a’); for ( var i = as.length; ...

    XML数字签名技术的研究及在Java中的实现* (2006年)

    目的 分析研究XML签名的规范和特点,比较XML签名与传统签名的区别,探讨XML签名的具体实现方法及其应用领域。方法 通过对XML签名和验证的具体过程的研究,采用Java安全技术和Apache的xml-security安全套件,给出了一...

    Android高级编程.pdf

    3.7 深入探讨Android活动 3.7.1 创建一个活动 3.7.2 活动生命周期 3.7.3 Android活动类 3.8 小结 第4章 创建用户界面 4.1 Android UI基本设计 4.2 View简介 4.2.1 使用View创建Activity(活动)用户界面 4.2.2 ...

    Flex企业应用开发实战源代码

    最后重点探讨Flex应用性能优化等方面的高级知识。值得一提的是,本书公开了作者努力开发出来的、经实际项目检验过的Flex企业应用框架的源代码,具有非常高的参考价值。 本书对Flex的基础知识着墨不多,所有内容都...

    js内存泄露的几种情况详细探讨

    而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露。浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。1、当页面中元素...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    9.1 地区和Java资源绑定 183 9.2 Struts中的国际化支持 185 9.3 text标签 188 9.4 i18n标签 191 9.5 以手动方式选择一个资源包 193 9.6 小结 195 第10章 Model Driven和Preparable拦截器 196 10.1 把动作与模型隔离...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    13.3 Android的动态加载技术 463 13.4 反编译初步 469 13.4.1 使用dex2jar和jd-gui反编译apk 470 13.4.2 使用apktool对apk进行二次打包 470 第14章 JNI和NDK编程 473 14.1 JNI的开发流程 474 14.2 NDK的开发...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...

    Android基础教程

    书中不仅结合数独游戏开发案例形象生动地讲解了Android生命周期、用户界面、2D图形、多媒体,以及本地数据存储等基础知识,而且通过“Hello, Android”项目深入探讨了外部通信、基于位置的服务、内置SQLite数据库、...

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

    为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多人更容易理解 GoF 的《设计模式》。由 于原著都是以C++为例, 以Java为例的设计模式基本又都以图形应用为例,而我们更关心Java在中间件等...

    深入浅出Struts2(附源码)

    9.1 地区和Java资源绑定 183 9.2 Struts中的国际化支持 185 9.3 text标签 188 9.4 i18n标签 191 9.5 以手动方式选择一个资源包 193 9.6 小结 195 第10章 Model Driven和Preparable拦截器 196 10.1 把动作与...

Global site tag (gtag.js) - Google Analytics