zoukankan      html  css  js  c++  java
  • 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() 
    ";
    		draw();
    		cout<<"Glyph() after draw()  
    ";
    	}
    	void draw(){
    		cout<<"Glyph.draw();  
    ";}
    };
    
    class RoundGlyph: public Glyph
    {
    public:
    	RoundGlyph(int r){
    		radius = r;
    		cout<<"RoundGlyph.RoundGlyph(), radius = "<< radius<<'
    ';
    	}
    	void draw(){
    		cout<<"RoundGlyph.draw(), radius =  "<<radius<<'
    ';
    	}
    private: 
    	int radius ;
    	
    };
    int main(){
    	RoundGlyph * r = new RoundGlyph(5);
    	return 0;
    }
    运行结果为:


    没有出现同样的问题,可以看出C++ 在多态的这个问题上表现得比较好。学 java 有一个作用,那就是让你

    更好地理解 C++ 。


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/Rex7/p/4752580.html
Copyright © 2011-2022 走看看