`

java动态绑定在属性和方法上的不同

阅读更多

运行时绑定也叫动态绑定,它是一种调用对象方法的机制。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();
    }
}
结果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();//向上转型,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());  
    }  


结果4:
调用的成员:儿子属性
总结:属性不能被虚拟调用,因为他不能被重写,而方法可以,它被对象的真实类型调用。

 

 

分享到:
评论

相关推荐

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

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

    Java与XML数据绑定

    通过在Java类上添加注解,JAXB可以自动地将XML文档解析为Java对象,同时也能将Java对象转换为XML文档。例如,使用`@XmlRootElement`注解标记一个类作为XML根元素,`@XmlElement`注解将类的属性映射到XML元素。 2. ...

    Java绑定XML架构的技术内涵

    - 在使用Java绑定XML技术时,首先需要定义XML Schema(XSD),该Schema描述了XML文档的结构和约束条件。 - 接下来,使用工具如XJC(XSD to Java Compiler)自动生成对应的Java类,这些Java类与XML Schema中的元素...

    JAVA和XML数据绑定 经典PDF

    Java和XML数据绑定是将XML文档中的数据与Java对象模型之间建立映射关系的技术,使得开发者可以方便地在XML和Java对象之间进行数据交换。这项技术对于处理XML数据的Java应用来说至关重要,尤其是在Web服务、配置文件...

    javafx之属性与绑定

    JavaFX 是一种新的 Java 技术,用于处理动态画面,画面精美令人赞叹。了解 JavaFX 的属性和绑定是非常重要的。 JavaFX 的属性是基于 JavaBean 的模式,但做了扩展和改进。JavaFX 的属性经常通过绑定来综合,这是一...

    WPF 双向绑定到非公开 set 方法属性在 NET 45 和 NET Core 行为的不同.rar

    “WPF 双向绑定到非公开 set 方法属性在 .NET 45 和 .NET Core 行为的不同”这个标题涉及到的是Windows Presentation Foundation (WPF) 中的一个特定技术问题,即双向数据绑定。双向数据绑定是WPF中一种强大的特性,...

    spring 属性参考与自动绑定

    在Java的Spring框架中,属性参考和自动绑定是两个重要的概念,它们为开发者提供了灵活且强大的依赖注入机制。本文将深入解析这两个概念,并通过示例代码来阐述其工作原理。 ### Spring属性参考 在Spring中,属性...

    XML_与_Java_技术_用_Castor_进行数据绑定.doc

    Castor框架支持自动生成XML文档的格式,只要Java对象遵循JavaBean规范,即包含公共getter和setter方法来访问和修改属性。这意味着开发者无需手动编写XML schema或配置文件,Castor就能根据对象的结构生成相应的XML...

    java hibernate不同数据库之间的动态切换

    然而,在某些情况下,我们可能需要在运行时根据不同的条件或需求动态地切换数据库,比如在测试环境和生产环境中使用不同的数据库。这个过程就称为“动态切换数据库”。在本文中,我们将深入探讨如何在Java Hibernate...

    easyUI ko绑定 java

    1. **EasyUI组件与Knockout.js结合**:EasyUI的控件可以绑定到Knockout的数据模型上,例如,可以将`<select>`的`value`属性绑定到模型的一个属性,这样在选择项改变时,模型中的数据也会自动更新。 2. **数据绑定**...

    Java中extends类的继承

    - 这样可以使用父类引用操作子类对象,实现方法的动态绑定,提高代码的灵活性和扩展性。 9. **super关键字** - `super`关键字用于引用当前对象的父类实例,可以调用父类的构造器、方法和字段。 - 例如,`super....

    java反射,获取所有属性、方法以及List集合类

    总之,Java反射为开发者提供了强大的功能,可以灵活地操作类和对象,实现运行时的动态绑定。通过反射,我们可以获取类的属性、方法信息,并且能够处理List集合类,进行动态的实例化、调用方法和修改属性等操作。然而...

    Java语言程序设计ppt第十一章(继承和多态)

    多态性是指一个对象可以被当做不同的类型来对待,动态绑定是指在运行时确定对象的类型。多态性和动态绑定是Java语言中非常重要的机制,它们可以使得代码更加灵活和可扩展。 六、Object类中的方法 Object类是Java...

    castor插件java对象和XML自动绑定maping文件生成和java对象一键生成工具

    Castor是一款强大的Java库,它提供了Java对象到XML数据的...总的来说,Castor插件提供了一种高效的方法来处理XML数据,通过自动绑定和对象生成,极大地提升了开发效率。在处理大量XML数据时,它是一个非常实用的工具。

    Java Jsp 调用ireport动态模板打印

    在这个场景下,我们主要讨论如何利用iReport创建动态模板,以及如何通过JSP和Java代码来调用这些模板实现热敏单的打印。 首先,我们需要了解iReport的基本使用。iReport允许开发者设计复杂的报表布局,包括表格、...

    继承和接口和java访问权限修饰符总结.doc

    继承是 Java 中的一种机制,允许子类继承父类的属性和方法,並且可以对父类的方法进行重写或重载。动态绑定是指在运行时确定方法的调用,而不是在编译时。多态性是通过继承和方法重写来实现的。 一、继承 继承是 ...

Global site tag (gtag.js) - Google Analytics