Java 动态绑定/多态

class Point {
    int x = 0, y = 0;    //父类成员Var
    public void move(int x,int y){
        this.x += x;
        this.y += y;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
}

class RealPoint extends Point {
    float x = 0.0f ,y = 0.0f;      //子类成员Var , 与父类同名,隐藏父类成员Var, 包括访问权限、类型 均以子类为准。
    public void move(float x, float y){  //与继承的父类方法的重写(Override)构成重载。
        this.x += x;            //this指向本身的引用,this.x 代表自身类的成员Var
        this.y += y;
    }
    public void move(int x,int y){    //对父类方法的重写,调用自身类的重载方法(Overload)参数个数和类型不同,其余相同。
        move((float)x, (float)y);
    }
    public int  getX() {
        return (int)Math.floor(x);    //Math.floor()  向下取整,直接截取小数点后小数部分。
    }
    public int getY() {
        return (int)Math.floor(y);
    }
}

public class Polymorphism {
    public static void main(String []args) {
        RealPoint rp = new RealPoint();    //创建子类对象,子类引用指向子类对象
        Point p = rp;              //父类引用类型,指向子类对象(p 和 rp指向内存同一块区域)Casting 对象转型
        rp.move(1.71828f,4.14159f);      //调用子类定义的第一个方法
        p.move(1,-1);               //调用子类定义的第二个方法,其真正实现,由第一个方法实现。 
        show(p.x, p.y);              //显示父类成员Var, 非静态成员变量在类加载的第二阶段已经加载好了,不会有动态绑定。
        show(rp.x, rp.y);              //显示子类成员Var
        show(p.getX(),p.getY());        //调用子类getX() getY(),子类方法返回子类成员Var,成员方法(有继承,有父类引用指向子类对象,有重写)会实现动态绑定,                            //调用实际指向的对象的方法,即调用RealPoint中的getX(),getY();
        show(rp.getX(),rp.getY());      //调用子类成员方法
    }
    public static void show(int x, int y){
        System.out.println("(" + x + "," + y + ")");
    }
    public static void show(float x ,float y) {
        System.out.println("(" + x + "," + y + ")");
    }
}

(0,0)
(2.7182798,3.14159)
(2,3)
(2,3)

源程序如上图,动态绑定(多态) 是针对的非static 、非final的成员方法,隐藏针对的是成员变量和static 方法。(针对且只针对)

只有Override (重写) 才会进行动态绑定,隐藏(即子类声明和父类同名同类型的成员变量和static 方法,则子类实例化对象通过对象名调用成员Variable 和 static 方法,子类的相应将父类隐藏,只会显示子类的成员Var 和 static 方法)。隐藏不会进行动态绑定。

内存布局如图所示,

1、p和rp指向同一子类对象。

2、子类继承父类,即子类对象包含父类对象。

3、动态绑定:原本父类对象的move()指针指向父类Point()的方法,由于有继承、有父类引用指向子类对象、有重写,Java会执行动态绑定机制,使得源代码中p.move(1,-1)调用的为子类的move()方法。 move()由黑线改成蓝色指向的move()方法。

4、父类引用指向子类对象,只能调用子类的方法,不能得到子类的成员变量(成员Var 无动态绑定,且Casting限定了父类引用只能使用父类Obj内部的方法和变量)。即p.getX() 调用的为子类方法。 p.x 不会得到子类的成员Var , 这也就是结果第一、二的出现的原因。

5、但是父类引用指向子类对象,调用子类方法,子类方法可以对子类成员变量进行操纵,近似于(但不等同于)父类引用可以得到子类成员Var(但并非直接,而是通过子类方法,子类方法向外提供修改子类成员Var的接口).  p.getX()  p.getY()  而 getX()  getY()返回的为子类自身成员Var。程序结果第三、四行出现的结果。

原文地址:https://www.cnblogs.com/leafh/p/8858458.html

时间: 2024-07-30 02:25:00

Java 动态绑定/多态的相关文章

Java中多态的一些简单理解

什么是多态 1.面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 2.多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 4.多态的作用:消除类型之间的耦合关系. 5.现实中,关于多态的例子不

个人对Java中多态的一些简单理解

什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 现实中,关于多态的例子不胜枚举. 下面是多态

Java基础 之Java动态绑定详解

程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定(早绑定 编译器绑定): 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定(迟绑定 运行期绑定): 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现

Java 动态绑定 静态绑定

绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定,或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现. 针对java简单的可以理解为程序编译期的绑定,这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定: 在运行时根据具体对象的类型进行绑定. 若一种语言实现了动态绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分

JAVA泛型多态

先度娘一下多态的概念: 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误: 如果有,再去调用子类的该同名方法. (来源:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html) 那如果要在Java中泛型做多态如何使用

从虚拟机指令执行的角度分析JAVA中多态的实现原理

从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧,隐隐约约地记得是与Class文件格式中的方法表有关,但是不知道虚拟机在执行的时候,是如何选择正确的方法来执行的了.so,趁着周末,把压箱底的<深入理解Java虚拟机>拿出来,重新看了下第6.7.8章中的内容,梳理一下:从我们用开发工具(Intellij 或者Eclipse)写的 .java 源程

Java:多态乃幸福本源

01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变:一个二郎神,也能七十二变:他们都可以变成不同的形态,但只需要悄悄地喊一声“变”. Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式:换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果.和孙悟空和二郎神都只需要喊一声“变”,然后就变了,并且每次变得还不一样:一个道理. 多态的前提条件有三个: 子类继承父类 子类覆盖父类的方法

Java——动态绑定和多态

动态绑定是在执行期间(而不是编译期间)判断所用对象的实际类型,根据其实际的类型调用其相应的方法(确定选择哪个多态形式被调用). 首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定   程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后

java之多态(Polymorphic)、动态绑定(Dynamic Binding)、迟绑定(Late Binding)

今天,我们来说说java面向对象最核心的东西,多态.通过多态可以使我们的程序可复用性达到极致,这就是我们为什么要学多态的原因. “多态”(Polymorphic)也叫“动态绑定”(Dynamic Binding)同时也叫“迟绑定”(Late Binding). 动态绑定是指“在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法.” 程序代码: public class TestPolymorphic{ public static void main(String a