Java的动态绑定

  看这段代码

  Father father = new Son();

父类引用指向子类对象,这是java的多态特性,有多态引到动态绑定,如何引入呢,看这个代码:

class Father{
    private String nameString;

    public void speak() {
        System.out.println(this.getClass()+"父类My name is:"+this.nameString);
    }
    public Father() {};
    public Father(String nameString) {
        this.nameString = nameString;
    }
}

class Son extends Father{
    private String nameString;

    public Son(String nameString) {
        this.nameString = nameString;
    }

    public void speak() {
        System.out.println(this.getClass()+"子类My name is:"+this.nameString);
    }
} Father father = new Son("黄山");  father.speak();

执行的结果是

class Son子类My name is:黄山
定义的是父类引用,但是这个引用指向了堆上的子类对象Son,执行的是子类的speak,并没有执行父类的。所谓的动态绑定就是指的这个:

    方法在运行时候根据具体指向的对象来确定。

这是我的理解。

静态绑定:

  与动态绑定相对的是静态绑定,所谓静态绑定就是方法在程序运行前就已经确定。java的静态绑定可以简单理解为程序编译期间的绑定。java当中的方法只有final,static,private和构造方法是静态绑定。

动态绑定与静态绑定另外有一种说法是前期绑定与后期绑定。

可见java的向上转型与多态是通过动态绑定来实现的。语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。

动态绑定只针对方法而不针对属性:

看程序:

public class JavaDt {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Father father = new Son();
         father.speak();      System.out.println(father.nameString);      }
}

class Father{
    public String nameString = "父类属性";

    public void speak() {
        System.out.println(this.getClass()+"父类My name is:"+this.nameString);
    }
    public Father() {};
    public Father(String nameString) {
        this.nameString = nameString;
    }
}

class Son extends Father{
    public String nameString = "子类属性";

    public void speak() {
        System.out.println(this.getClass()+"子类My name is:"+this.nameString);
    }
}

执行结果是:
class Son子类My name is:子类属性
父类属性

father.name 读取的是父类的属性。

如果想访问父类属性只要将属性包装成方法就可以了。

时间: 2024-08-05 23:33:26

Java的动态绑定的相关文章

Java的动态绑定机制

Java的动态绑定又称为运行时绑定.意思就是说,程序会在运行的时候自动选择调用哪儿个方法. 一.动态绑定的过程: 例子: public class Son extends Father Son son = new Son(); son.method(); 1. 首先,编译器根据对象的声明类型和方法名,搜索相应类(Son)及其父类(Father)的"方法表",找出所有访问属性为public的method方法. 可能存在多个方法名为method的方法,只是参数类型或数量不同. 2. 然后,

java的动态绑定与双分派(规避instanceof)

1. 动态绑定的概念 指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法 . 例如: package org.demo.clone.demo; public class DynamicBound { public static void main(String[] args) { Person person = new Man() ; person.say() ; } } class Person{ public void say(){} ; } clas

Java 多态(动态绑定)

Java 多态(动态绑定) @author ixenos 绑定 将一个方法的调用和一个方法的主体关联起来,称作(方法调用)绑定: 1.前期绑定:在程序执行前绑定(由编译器和连接程序实现): 2.后期绑定:在运行时根据对象的类型绑定(也称动态绑定或运行时绑定): a) 实现条件:能在运行时判断对象的类型,从而关联对应主体,调用其方法 b) 编译器一直不知道真实对象类型,只将其认作引用变量的类型且知道有继承关系 c) Java中除了static方法和final方法(private方法属于final方

java的动态绑定和静态绑定

首先是方法的参数是父类对象,传入子类对象是否可行然后引出Parent p = new Children();这句代码不是很理解,google的过程中引出向上转型要理解向上转型又引出了动态绑定从动态绑定又引出了静态绑定 程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C.针对java简单的可以理解为程序编译期的绑定:这里特别

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

java设计模式(三)模板模式

抽象类中公开定义了执行它的方法的方式,子类可以按需求重写方法实现,但调用将以抽象类中定义的方式进行,典型应用如银行办理业务流程.冲泡饮料流程.下面给出简单例子,用沸水冲泡饮料,分为四步:将水煮沸.泡制饮料.将饮料倒入杯中.加入调味料. 1.模板抽象类 要点:1)抽象类  2)final修饰的模板方法 public abstract class RefreshTemplate { public final void refresh() { //将水煮沸 biolWater(); //炮制饮料 br

JAVA深入研究——Method的Invoke方法。

在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码. Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Accessibl

java 常量池

在jvm规范中,每个类型都有自己的常量池.常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型.字段.方法的符号引用.之所以是符号引用而不是像c语言那样,编译时直接指定其他类型,是因为java是动态绑定的,只有在运行时根据某些规则才能确定具体依赖的类型实例,这正是java实现多态的基础. 为了对常量池有更具体的认识,下面引用几个例子: 1,常量池中对象和堆中的对象 public class Test{ Integer i1=new Integer(1);   

Java系列2 --- 你真的知道Java的String对象么?

?在上一篇中说道这篇文章会说java的动态绑定机制,由于这个知识点放在继承中讲会比较合适,说以在这篇文章中先来详细的说说String对象吧. ?只要学过Java的同学,我们都知道Java一共有8中基本类型,但是在Java中最常用的String类型却不属于这8中基本类型中.他是Java.lang包中的一个类.但是String对象在引用传递中JVM的处理却与其他对象不同. ?在正式开始来讲这个String对象的时候我们首先来简单的说明下Java中的值传递和引用传递.正如很多Java说熟知的那样,Ja