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 ...
随机推荐
- 浅谈MySQL索引背后的数据结构及算法(转载)
转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...
- Linux crond定时任务
第1章 Crond是什么? Crond是linux系统用来定期执行命令或指定程序任务的一种服务或软件.一般情况下,我们安装完Centos5/6linux操作系统之后,默认便会启动Crond任务调度服务 ...
- 2016 Al-Baath University Training Camp Contest-1 F
Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...
- 2016 Al-Baath University Training Camp Contest-1 C
Description Rami went back from school and he had an easy homework about bitwise operations (and,or, ...
- 2016 ACM/ICPC Asia Regional Qingdao Online HDU5883
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 解法:先判断是不是欧拉路,然后枚举 #pragma comment(linker, "/S ...
- Python 2.7.9 Demo - 三元表达式
#coding=utf-8 #!/usr/bin/python import logging; a = 'abc'; print 'Y' if isinstance(a, str) else 'N';
- VFL +AutoLayout
横竖屏事件响应(viewWillLayoutSubviews和通知)两种方式 http://blog.csdn.net/nogodoss/article/details/17246489 一,NSLa ...
- percona-toolkit工具包的使用教程之开发类工具
percona-toolkit工具包的使用教程之开发类工具 1. pt-duplicate-key-checker l 功能介绍: 功能为从mysql表中找出重复的索引和外键,这个工具会将重复的索 ...
- R语言画图基础参数设置
Graphical Parameters You can customize many features of your graphs (fonts, colors, axes, titles) th ...
- 目前比较全的CSS重设(reset)方法总结
在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是 重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈现相同的 ...