java 方法调用绑定--《java编程思想》学习笔记
将一个方法调用同一个方法主体关联起来,就是绑定。 绑定分两种 :前期绑定 和 后期绑定 。
绑定-------------
| -----前期绑定-------编译期绑定 { static , final 方法 (private 方法属于final 方法);数据成员;}
|
|------后期绑定-------运行时绑定 { 普通的成员方法 ;}
总结:对于方法来说, 除了static 和final 方法外, 其他的方法都是后期绑定。
编译时对引用只检查被声明的类型,而不看实际类型。
将某个方法声明为 final 的作用-------
{ 防止该方法被覆盖,即告诉编译器,对此方法不需要动态绑定;}
多态产生的问题:
引用《java编程思想》(第四版)里的例子:
class Glyph{
void draw(){print("Glyph.draw();")}
Glyph(){
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
} class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw(){
print("RoundGlyph.draw(), radius = "+ radius);
}
} public class PolyConstructors{
public static void main(String[] args){
new RoundGlyph(5);
}
} /*Output:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
*/
new 一个RoundGlyph 对象时,构造器的执行顺序 是: 父类 ----->子类, 所以, 先执行Glyph 的构造器,
然后执行 RoundGlyph 的构造器,但是,Glyph 的构造器调用了 draw 成员函数,所以该执行 Glyph 的draw 成
员函数? No,因为多态,对于一般成员函数来说, 运行时才绑定, 因为new 的是 RoundGlyph 对象, 所以
绑定的是RoundGlyph 的draw 函数,与此同时,RoundGlyph 的 成员radius 还没初始化,所以出现了 0 。
接下来,就轮到 RoundGlyph 的构造函数了,因为在构造函数里 ,RoundGlyph 的成员 radius 先初始化了,
然后执行 RoundGlyph 的draw 函数,所以,radius = 5。
总结: 尽量避免在构造器中调用其他方法,防止因多态产生一些意想不到的问题。
现在,我们来看看C++ 中会不会出现这样的问题,把java 代码改成C++:
#include<iostream>
using namespace std; class Glyph
{
public:
Glyph(){
cout<<"Glyph() before draw() \n";
draw();
cout<<"Glyph() after draw() \n";
}
void draw(){
cout<<"Glyph.draw(); \n";}
}; class RoundGlyph: public Glyph
{
public:
RoundGlyph(int r){
radius = r;
cout<<"RoundGlyph.RoundGlyph(), radius = "<< radius<<'\n';
}
void draw(){
cout<<"RoundGlyph.draw(), radius = "<<radius<<'\n';
}
private:
int radius ; };
int main(){
RoundGlyph * r = new RoundGlyph(5);
return 0;
}
运行结果为:
没有出现同样的问题,可以看出C++ 在多态的这个问题上表现得比较好。学 java 有一个作用,那就是让你
更好地理解 C++ 。
版权声明:本文为博主原创文章,未经博主允许不得转载。
java 方法调用绑定--《java编程思想》学习笔记的更多相关文章
- Java编程思想 学习笔记8
八.多态 在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来. “封装”通过合并特征和行为来创建新的数据类型.“实现 ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想学习笔记——类型信息
前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...
- java 方法调用绑定
将一个方法调用同一个方法主体关联起来被称作绑定.若在程序执行前进行绑定(由编译器和连接器实现),叫做前期绑定.读者可能从来没有听说过这个术语,因为它在面向过程语言中不需要选择就默认的绑定方式.例如C语 ...
- Java编程思想 学习笔记12
十二.通过异常处理错误 Java的基本理念是“结构不佳的代码不能运行”. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型.可靠的程序的生成,并且通过这种方式可以使你更加自信:你的 ...
- Java方法调用的字节码指令学习
Java1.8环境下,我们在编写程序时会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种: invokespecial:调用私有实例方法: invokestatic:调 ...
- Java编程思想学习笔记_6(并发)
一.从任务中产生返回值,Callable接口的使用 Callable是一种具有泛型类型参数的泛型,它的类型参数表示的是从方法call返回的值,而且必须使Executor.submit来去调用它.sub ...
- Java编程思想学习笔记_2(继承和多态)
静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...
随机推荐
- UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)
题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...
- 【 D3.js 高级系列 — 8.0 】 标线
有时候,需要在地图上绘制连线,表示"从某处到某处"的意思,这种时候在地图上绘制的连线,称为"标线". 1. 标线是什么 标线,是指地图上需要两个坐标以上才能表示 ...
- Android好用且常用的插件及工具
1.GitHub,这个不管是做安卓还是其他,只要是开发就必上的网站,也是天朝没有墙掉为数不多的网站 2.Stack OverFlow,这个和上面一样,国外非常著名的问答网站,在上面基本上很多问题都可以 ...
- K2 blackpearl 流程开发(一)
转:http://blog.csdn.net/gxiangzi/article/details/8444060 郁闷,今天K2的license过期了,很多东西都没法用了,还得去找PM大大帮忙申请一个. ...
- C#判断用户是否使用微信浏览器,并据此来显示真实内容或二维码
平时我们看一些网页的时候会发现这样的功能:有的页面只能在微信里访问,如果在电脑上访问就只显示当前地址的二维码.这个用C#怎么实现呢?我们结合代码来看看. 首先,我们需要先判断用户使用的是什么浏览器,这 ...
- 为redis分配一个新的端口
为redis分配一个8888端口,操作步骤如下:1.$REDIS_HOME/redis.conf重新复制一份,重命名为redis8888.conf.2.打开redis8888.conf配置文件,找到p ...
- 七中滤波方法测试matlab实现
http://blog.163.com/xiaheng0804@126/blog/static/1205282120132129471816/ 创建两个混合信号,便于更好测试滤波器效果.同时用七中滤波 ...
- 一个可序列化的C#对象,如何转成一个XML格式的文件或字符串【转】
原文:http://blog.csdn.net/otong/article/details/7894059 序列化或反序列化成一个字符串: 方法一: 序列化: public static string ...
- 利用原生JavaScript获取样式的方式小结
来源:http://www.ido321.com/930.html ps:是获取样式,不是设置样式.若没有给元素设置样式值,则返回浏览器给予的默认值.(论坛整理) 1.element.style:只能 ...
- Machine Learning & Data Mining 资料整合
机器学习常见算法分类汇总 | 码农网 数据挖掘十大经典算法 | CSDN博客 (内含十个算法具体介绍) 支持向量机通俗导论(理解 SVM 的三层境界)| CSDN博客 (强烈推荐关注博主) 教你如何迅 ...