`
seastar09
  • 浏览: 17389 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

java动态绑定

阅读更多
本文转 “子 孑” 博客:http://zhangjunhd.blog.51cto.com/113473/49452

运行时绑定也叫动态绑定,它是一种调用对象方法的机制。Java调用对象方法时,一般采用运行时绑定机制。
1.Java的方法调用过程
编译器查看对象的声明类型和方法名(对象变量的声明类型)。通过声明类型找到方法列表。
编译器查看调用方法时提供的参数类型。
如果方法是private、static、final或者构造器,编译器就可以确定调用那个方法。这是静态绑定。
如果不是上述情况,就要使用运行时(动态)绑定。在程序运行时,采用动态绑定意味着:虚拟机将调用对象实际类型所限定的方法。
2.运行时(动态)绑定的过程
虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法。
注意,这里说的是对象的实际类型。即在多态的情况下,虚拟机可以找到所运行对象的真正类型。
3.在向上转型情况下的动态绑定示例
Java代码
public class Father {  
    public void method() {  
       System.out.println("父类方法,对象类型:" + this.getClass());  
    }  
}  
   
public class Son extends Father {  
    public static void main(String[] args) {  
       Father sample = new Son();//向上转型  
       sample.method();  
    }  


public class Father {
    public void method() {
       System.out.println("父类方法,对象类型:" + this.getClass());
    }
}

public class Son extends Father {
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       sample.method();
    }
}
结果1:
父类方法,对象类型:class samples.Son

这个结果没有疑问,声明的是父类的引用(句柄),但准确的调用了子类的对象,调用method,在子类中没有该方法,所以去父类中寻找到并调用之。
现在修改子类,重写(override)method方法。
Java代码
public class Son extends Father {  
    public void method() {  
       System.out.println("子类方法,对象类型:" + this.getClass());  
    }  
     
    public static void main(String[] args) {  
       Father sample = new Son();//向上转型  
       sample.method();  
    }  


public class Son extends Father {
    public void method() {
       System.out.println("子类方法,对象类型:" + this.getClass());
    }
  
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       sample.method();
    }
}
结果2:
子类方法,对象类型:class samples.Son

这个结果也是意料之中的。调用method时,在子类中寻找到了该方法,所以直接调用之。
4.静态绑定成员变量
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性还是父类的属性。
现在再进一步变化,在父类和子类中同时定义和赋值同名的成员变量name,并试图输出该变量的值。
Java代码
public class Father {  
    protected String name="父亲属性";  
     
    public void method() {  
       System.out.println("父类方法,对象类型:" + this.getClass());  
    }  
}  
   
public class Son extends Father {  
    protected String name="儿子属性";  
     
    public void method() {  
       System.out.println("子类方法,对象类型:" + this.getClass());  
    }  
     
    public static void main(String[] args) {  
       Father sample = new Son();//向上转型  
       System.out.println("调用的成员:"+sample.name);  
    }  


public class Father {
    protected String name="父亲属性";
  
    public void method() {
       System.out.println("父类方法,对象类型:" + this.getClass());
    }
}

public class Son extends Father {
    protected String name="儿子属性";
  
    public void method() {
       System.out.println("子类方法,对象类型:" + this.getClass());
    }
  
    public static void main(String[] args) {
       Father sample = new Son();//向上转型,new Son() 时候是先构造父类的 
       System.out.println("调用的成员:"+sample.name);
    }
}
结果3:
调用的成员:父亲属性

这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。
现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。
Java代码
public class Father {  
    protected String name = "父亲属性";  
   
    public String getName() {  
       return name;  
    }  
   
    public void method() {  
       System.out.println("父类方法,对象类型:" + this.getClass());  
    }  
}  
   
public class Son extends Father {  
    protected String name="儿子属性";  
     
    public String getName() {  
       return name;  
    }  
     
    public void method() {  
       System.out.println("子类方法,对象类型:" + this.getClass());  
    }  
     
    public static void main(String[] args) {  
       Father sample = new Son();//向上转型  
       System.out.println("调用的成员:"+sample.getName());  
    }  


public class Father {
    protected String name = "父亲属性";

    public String getName() {
       return name;
    }

    public void method() {
       System.out.println("父类方法,对象类型:" + this.getClass());
    }
}

public class Son extends Father {
    protected String name="儿子属性";
  
    public String getName() {
       return name;
    }
  
    public void method() {
       System.out.println("子类方法,对象类型:" + this.getClass());
    }
  
    public static void main(String[] args) {
       Father sample = new Son();//向上转型
       System.out.println("调用的成员:"+sample.getName());
    }
}
结果4:
调用的成员:儿子属性
总结:属性不能被虚拟调用,因为他不能被重写,而方法可以,它被对象的真实类型调用。
分享到:
评论

相关推荐

    Java动态绑定和内联

    Java动态绑定和内联是Java编程中的两个关键概念,它们对于理解Java的面向对象特性,尤其是多态性和性能优化有着重要的作用。 动态绑定,又称晚期绑定或运行时绑定,是Java语言的一个核心特性。它指的是在运行时而非...

    Java动态绑定和静态绑定.doc

    在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...

    java动态绑定和静态绑定用法实例详解

    "Java动态绑定和静态绑定用法实例详解" Java中的绑定机制是指将一个方法的调用与方法所在的类(方法主体)关联起来。Java中存在两种类型的绑定机制:静态绑定和动态绑定。 静态绑定是指在程序执行以前已经被绑定...

    Java动态绑定的方法重载的实现.zip

    Java动态绑定和方法重载是面向对象编程中的两个核心概念,它们在Java程序设计中扮演着重要角色。这里我们将深入探讨这两个概念以及它们在实际应用中的实现。 首先,让我们了解什么是方法重载(Method Overloading)...

    Java动态绑定的方法重载的实现.pdf

    Java动态绑定的方法重载的实现.pdf

    Java动态绑定机制的内幕

    这篇文章我们将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。  静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println(...

    理解Java中的静态绑定和动态绑定

    在Java编程语言中,静态绑定和动态绑定是两种不同的方法调用机制,它们与面向对象编程密切相关。这两种绑定方式决定了程序在运行时如何选择和执行特定的方法。 静态绑定(早期绑定),也称为编译时绑定,是指在程序...

    java代码绑定时间

    ### Java代码绑定时间:深入理解Oracle绑定变量的重要性 在Java编程中,特别是在处理与数据库交互的应用场景下,正确地使用数据库绑定变量对于提升系统性能、减少资源消耗具有至关重要的作用。本文将围绕“Java代码...

    Java中的静态绑定和动态绑定Java开发Java经验技巧

    在Java编程语言中,静态绑定和动态绑定是两个至关重要的概念,它们关乎程序的执行效率和灵活性。了解这两个概念对于提升Java开发技能至关重要。 首先,我们来解释一下静态绑定(也称为早期绑定)。静态绑定主要涉及...

    Java多态中动态绑定原理解析

    "Java多态中动态绑定原理解析" Java多态中动态绑定原理解析是Java面向对象程序设计中非常重要的特性,它让程序拥有更好的可读性和可扩展性。在Java中,多态是发生在继承关系中的,需要子类重写父类的方法。父类类型...

    Java方法的动态绑定与静态绑定

    对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。  静态绑定:  在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。  针对java简单的可以理解为程序编译期的...

    Java 静态绑定与动态绑定深入分析

    Java中的静态绑定与动态绑定是面向对象编程中的关键概念,它们决定了方法调用的方式和时机。静态绑定(也称为早期绑定或编译时绑定)和动态绑定(也称为晚期绑定或运行时绑定)是Java中多态性实现的基石。 **静态...

    xml和java绑定

    以下是一些关于XML和Java绑定的关键知识点: 1. **Java API for XML Processing (JAXB)**: JAXB是Java平台标准的一部分,它提供了将Java对象转换为XML文档(对象到XML),以及从XML文档还原Java对象(XML到对象)的...

    Java绑定XML架构的技术内涵

    ### Java绑定XML架构的技术内涵 #### 一、引言 在现代软件开发中,XML(Extensible Markup Language)被广泛应用于数据交换与存储。而Java作为一种主流的编程语言,在处理XML方面有着丰富的工具和技术支持。Java...

    java公众号绑定域名,微信消息接收和token验证

    java实现公众号绑定域名,微信消息接收和token验证功能

    在Java中实现Oracle变量的绑定方法 .doc

    在Java中实现Oracle变量的绑定方法,主要是为了优化SQL语句的执行效率,减少数据库解析负担,提升系统性能。Oracle数据库在处理SQL语句时,会先进行解析,然后将解析后的SQL语句存储在共享池(Shared Pool)中。如果...

    Java与XML数据绑定

    Java与XML数据绑定是将XML文档中的数据结构映射到Java对象的过程,反之亦然。这一技术使得在Java应用程序中处理XML数据变得更加便捷,避免了手动解析和构建XML字符串的繁琐工作。本篇将深入探讨Java中XML数据绑定的...

    《剑指offer》Java理解静态绑定与动态绑定.pdf

    Java中的静态绑定与动态绑定是面向对象编程中的两个核心概念,它们关系到程序的编译与运行时行为。理解这两个概念对于写出高效、灵活的代码至关重要。 首先,静态绑定(也称为前期绑定或编译时绑定)是指在编译期间...

    echarts 属性全动态设置 数据动态绑定

    java实现对echarts 属性全动态设置 数据动态绑定。封装echarts 的绘图方法,使得js只需要getLine(data),getBar(data)等就可以绘制图形。echarts上的所有属性都可以在java中设置。

    JComboBox动态绑定数据库

    本实例是关于如何将`Sql2000`数据库中的数据与`JComboBox`进行动态绑定,通过`JDBC`(Java Database Connectivity)接口来实现数据库连接和数据交互。 首先,我们需要理解`JComboBox`的基本用法。`JComboBox`是...

Global site tag (gtag.js) - Google Analytics