• 多态部分:Java静态绑定与动态绑定


    程序绑定的概念:
    绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.

    静态绑定:
    在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。例如:C。
    针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定

    动态绑定:
    后期绑定:在运行时根据具体对象的类型进行绑定
    若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。
    动态绑定的过程:

    虚拟机提取对象的实际类型的方法表;

    虚拟机搜索方法签名;

    调用方法。

    java的编译与运行
    java的编译过程是将java源文件编译成字节码(jvm可执行代码,即.class文件)的过程,在这个过程中java是不与内存打交道的,在这个过程中编译器会进行语法的分析,如果语法不正确就会报错。
    Java的运行过程是指jvm(java虚拟机)装载字节码文件并解释执行。在这个过程才是真正的创立内存布局,执行java程序。
    java字节码的执行有两种方式:

    (1)即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码;

    (2)解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节码程序的所有操作。(这里我们可以看出java程序在执行过程中其实是进行了两次转换,先转成字节码再转换成机器码。这也正是java能一次编译,到处运行的原因。在不同的平台上装上对应的java虚拟机,就可以实现相同的字节码转换成不同平台上的机器码,从而在不同的平台上运行)

    与方法不同,在处理java类中的成员变量(实例变量和类变量)时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性(成员变量)还是父类的属性(子类对父类成员变量的隐藏)。
    下面是代码测试实例:

    1. public class Father {  
    2. protected String name = "父亲属性";  
    3. }  
    4. public class Son extends Father {  
    5. protected String name = "儿子属性";  
    6. public static void main(String[] args) {  
    7.         Father sample = new Son();  
    8.         System.out.println("调用的属性:" + sample.name);  
    9.     }  
    10. }  

    结论,调用的成员为父亲的属性。
    这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法
    现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式
    代码如下:
    Java代码 

    1. public class Father {  
    2. protected String name = "父亲属性";  
    3. public String getName() {  
    4. return name;  
    5.     }  
    6. }    
    7. public class Son extends Father {  
    8. protected String name = "儿子属性";  
    9. public String getName() {  
    10. return name;  
    11.     }  
    12. public static void main(String[] args) {  
    13.         Father sample = new Son();  
    14.         System.out.println("调用的属性:" + sample.getName());  
    15.     }  
    16. }  

    结果:调用的是儿子的属性
    java因为什么对属性要采取静态的绑定方法。这是因为静态绑定是有很多的好处,它可以让我们在编译期就发现程序中的错误,而不是在运行期。这样就可以提高程序的运行效率!而对方法采取动态绑定是为了实现多态,多态是java的一大特色。多态也是面向对象的关键技术之一,所以java是以效率为代价来实现多态这是很值得的。

    注:以上内容大部分来自互联网,小部分是个人见解,绝非权威性言论。如有语言表达不当或者表述不正确的地方,万望指教。

  • 相关阅读:
    leetcode 7.删除有序数组中的重复项
    python 插入排序
    C# 异常处理
    C# 正则表达式
    C# 特性(Attribute)
    C# 预处理器指令
    C# 命名空间(Namespace)
    C# 文件的输入与输出
    C# 反射(Reflection)
    Python入门示例系列37 常用函数
  • 原文地址:https://www.cnblogs.com/hyqblog/p/6407371.html
Copyright © 2020-2023  润新知