• 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++ 。


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

  • 相关阅读:
    1657: [Usaco2006 Mar]Mooo 奶牛的歌声
    1610: [Usaco2008 Feb]Line连线游戏
    1660: [Usaco2006 Nov]Bad Hair Day 乱发节
    bzoj1207 [HNOI2004]打鼹鼠
    bzoj1046 [HAOI2007]上升序列
    bzoj3594 [Scoi2014]方伯伯的玉米田
    bzoj1878 [SDOI2009]HH的项链
    bzoj1293 [SCOI2009]生日礼物
    bzoj3211 花神游历各国
    bzoj3038 上帝造题的七分钟2
  • 原文地址:https://www.cnblogs.com/Rex7/p/4752580.html
Copyright © 2020-2023  润新知