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 ...
随机推荐
- Java中的String为什么是不可变的?
转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那 ...
- winform中拖动功能实现技巧
实现的需求,我通过拖动选中的用户行放到左边的机构节点上,从而实现用户改变组织机构的关系 贴代码 private DataGridViewSelectedRowCollection sourceRowC ...
- java提高篇---HashMap
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- VC++检测当前网络状态
VC获得本机网络连接状态 转载:http://www.cppblog.com/wrhwww/archive/2010/12/02/135230.html //本机网络连接类型(成功) #define ...
- (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
package a; public class People { private String name,sex; private int age; private double height; pu ...
- CocoaPods的安装[转载]
[转载] 原地址http://www.tuicool.com/articles/7VvuAr3 觉得很好,很有用 iOS 最新版 CocoaPods 的安装流程 1.移除现有Ruby默认源 $gem ...
- Python 字符编码 zz
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American Stan ...
- 通过桥接虚拟网卡使VMWare和宿主机实现双向通讯
0.为什么选择虚拟网卡和桥接模式 首先虚拟机网络设置为NAT,虚拟机实现上网是很方便的,但是宿主机访问虚拟机就比较麻烦了(需要单独配置端口转发),桥接就能很好的解决这个问题,桥接模式会把虚拟机当做宿主 ...
- jquery相对选择器,又叫context选择器,上下文选择器;find()与children()区别
jquery相对选择器有两个参数,jQuery函数的第二个参数可以指定DOM元素的搜索范围(即以第二个参数指定的内容为容器查找指定元素). 第二个参数的不同的类型,对应的用法如下表所示. 类型 用法 ...