Java的动态绑定
看这段代码
Father father = new Son();
父类引用指向子类对象,这是java的多态特性,有多态引到动态绑定,如何引入呢,看这个代码:
class Father{
private String nameString;
public void speak() {
System.out.println(this.getClass()+"父类My name is:"+this.nameString);
}
public Father() {};
public Father(String nameString) {
this.nameString = nameString;
}
}
class Son extends Father{
private String nameString;
public Son(String nameString) {
this.nameString = nameString;
}
public void speak() {
System.out.println(this.getClass()+"子类My name is:"+this.nameString);
}
}
Father father = new Son("黄山");
father.speak();
执行的结果是
class Son子类My name is:黄山
定义的是父类引用,但是这个引用指向了堆上的子类对象Son,执行的是子类的speak,并没有执行父类的。所谓的动态绑定就是指的这个:
方法在运行时候根据具体指向的对象来确定。
这是我的理解。
静态绑定:
与动态绑定相对的是静态绑定,所谓静态绑定就是方法在程序运行前就已经确定。java的静态绑定可以简单理解为程序编译期间的绑定。java当中的方法只有final,static,private和构造方法是静态绑定。
动态绑定与静态绑定另外有一种说法是前期绑定与后期绑定。
可见java的向上转型与多态是通过动态绑定来实现的。语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。
动态绑定只针对方法而不针对属性:
看程序:
public class JavaDt {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Father father = new Son();
father.speak();
System.out.println(father.nameString);
}
}
class Father{
public String nameString = "父类属性";
public void speak() {
System.out.println(this.getClass()+"父类My name is:"+this.nameString);
}
public Father() {};
public Father(String nameString) {
this.nameString = nameString;
}
}
class Son extends Father{
public String nameString = "子类属性";
public void speak() {
System.out.println(this.getClass()+"子类My name is:"+this.nameString);
}
}
执行结果是:
class Son子类My name is:子类属性
父类属性
father.name 读取的是父类的属性。
如果想访问父类属性只要将属性包装成方法就可以了。
Java的动态绑定的更多相关文章
- Java的动态绑定机制
Java的动态绑定又称为运行时绑定.意思就是说,程序会在运行的时候自动选择调用哪儿个方法. 一.动态绑定的过程: 例子: public class Son extends Father Son son ...
- 访问者模式讨论篇:java的动态绑定与双分派
java的动态绑定 所谓的动态绑定就是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.java继承体系中的覆盖就是动态绑定的,看一下如下的代码: class ...
- java的动态绑定和多态
public class Shape { public void area() { System.out.println("各种形状的面积..."); } public stati ...
- 关于 java 的动态绑定机制
关于 java 的动态绑定机制 聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解. 网上大多一言概括: 当调用对象的时候,该方法会和该对象的内存地址/运行类型绑定. 当调用对象的属性 ...
- java的动态绑定和静态绑定
首先是方法的参数是父类对象,传入子类对象是否可行然后引出Parent p = new Children();这句代码不是很理解,google的过程中引出向上转型要理解向上转型又引出了动态绑定从动态绑定 ...
- java的动态绑定与双分派(规避instanceof)
1. 动态绑定的概念 指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法 . 例如: package org.demo.clone.demo; public c ...
- java 基础 动态绑定和多态
- java — 静态绑定和动态绑定
绑定:一个方法的调用与方法所在的类关联起来.java中的绑定分为静态绑定和动态绑定,又被称作前期绑定和后期绑定. 静态绑定:(final.static.private)在程序执行前已经被绑定,也就是说 ...
- JAVA深入研究——Method的Invoke方法。
在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...
随机推荐
- 修改Windows下的键盘映射
在知乎上看见有人说Ctrl键放在A的旁边会更方便,于是我就琢磨着把Cap Lock键改成Ctrl 我肯定不愿意用第三方工具修改的,于是找到了这篇文章,很容易的就修改成功,现在用起来果然舒服多了. 附上 ...
- web简单连接html文件测试
Web工程: 条件: apache-tomcat-6.0.20(文件夹/7.0)=======位于E盘 标题:链接服务器 步骤: 第一步:打开apache-tomcat-6.0.20-bin-star ...
- Myeclipse 添加server library
来自网络资料 (1)File->New->Other (2)弹出窗口勾上Show All Wizards,然后在type fiter text那里输入Server,选中server-> ...
- SqlSever基础 over与avg配合,将平均值添加到原表的右侧,并为新列起名
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- MSM8974 fastboot烧写软件
fastboot烧写是在aboot阶段做的,所以空板没有完整烧写aboot及其boot sequence前的image是没法使用fastboot的.在手机开机状态下,执行: adb re ...
- 【leetcode❤python】Convert a Number to Hexadecimal
#-*- coding: UTF-8 -*- class Solution(object): hexDic={0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6', ...
- C++实现有向权图的基本操作,界面友好,操作方便,运行流畅
Ⅰ.功能: .创建图 .展示全图 .添加顶点 .添加边 .删除顶点 .删除边 .查看指定边权值 .修改指定边权值 .输出两点间的所有简单路及路径对应权值 .销毁图 ps:关于9,如果不存在任何简单路, ...
- Java获取音频文件(MP3)的播放时长
最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...
- An Example of On-Error Trigger in Oracle Forms
I wrote this trigger around 4 years ago to handle errors in an application based on Oracle Forms 6i. ...
- git log 查看 提交历史
在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 Git log 命令查看. 接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源代码: git ...