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 ...
随机推荐
- 网页撤销后ubuntu本地撤销
git reset --hard <commit_id> 回到上一个commit: 之后再 git reset --hard :
- P1119 灾后重建
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- for循环以及复杂if else 例题
for循环语句 例一. 请输入一个整数,求1加到这个整数的和 例二 请从1到100 以内和7 有关的数字 例三,请设计一个游戏,前20关每关的分数是本身,21到30 是10分每关.31到40是20分每 ...
- android 引入phonegap
步骤: 1.复制cordova-2.9.0.jar 到lib文件下 2.在assets文件下创建www文件夹及其cordova.js .jquery.js.jquery.mobile-1.3.2.cs ...
- Storm系列之三——Fault Tolerance
本文介绍Storm容错的设计细节. 1.当一个worker进程死了会发生什么? 当worker死了,supervisor会重启它.如果它尝试开启多次失败并且不能与nimbus发送心跳,Nimbus会重 ...
- HTTP缓存机制
缓存对于移动端是非常重要的存在. 减少请求次数,减小服务器压力. 本地数据读取速度更快,让页面不会空白几百毫秒. 在无网络的情况下提供数据. 缓存一般由服务器控制(通过某些方式可以本地控制缓存,比如向 ...
- Android 中 Service AIDL使用
1.创建两个项目创建两个.aidl文件 2.在传递值的类里面创建Service并且返回接口: 服务返回值onBind public IBinder onBind(Intent intent) ...
- 是否用new来新建对象
class A{ }: 1.不使用new来新建对象 A a: 使用完后什么也不用做,系统自动调用析构函数.使用空间是栈. 2.使用new来新建对象 A* a=new A(); delete a;/ ...
- 求数组中的最小子数组,时间复杂度o(n),java
石家庄铁道大学 信1405-1 班 唐炳辉 题目:给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当 ...
- Java多个数字求和输出
设计思想: 首先为了能够输入数字,先引入一个类import java.util.Scanner;因为是多个数字求和,所以为了方便声明一个数组double[] num;再声明一个变量int number ...