多态 动态连接 字节码层面分析


前言

       java中的多态性是作为面向对象的程序设计语言最核心的特征,表示一个对象有着多重特征,可以在特定的情况下表现出不同的状态,从而对应着不同的属性和方法。
       就java而言,多态性就是允许将父对象设置成为一个或更多与自身子对象相等的技术,赋值之后父对象就可以根据当前赋值给自身子对象的特性以不同的方式运作。
       java中多态性可以把不同的子类对象都当作父类来看,从而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。


提示:以下是本篇文章正文内容,下面案例可供参考

一、案例源码

class father {
    int x = 10;

    public father() {
        this.print();
        x = 20;
    }

    public void print() {
        System.out.println("f.x=" + x);
    }
}

class son extends father {
    int x = 30;

    public son() {
        this.print();
        x = 40;
    }

    public void print() {
        System.out.println("s.x=" + x);
    }
}

class taaa {
    public static void main(String[] args) {
        father s = new son();
        System.out.println("end=" + s.x);
    }
}

这里直接附上结果
在这里插入图片描述

二、分析father字节码

       1. 首先我们先观察father的字节码文件的init方法,从中可以清晰的看出father在进行初始化时的执行步骤,aload_0 就是加载局部变量表中的this,然后执行父类的init方法,然后再给x 变量赋值为 10,然后执行了父类的print方法,最后将x 的值赋值为20
在这里插入图片描述

2.分析 son 字节码

      从中可以清晰的看出son 在进行初始化时的执行步骤,首先还是aload_0 加载了this,然后调用父类的init方法,这里需要格外注意,因为java的动态连接作用,一旦子类重写了父类的方法,在父类引用中调用方法时将执行子类重写过的方法,所以,此时执行的是子类son 的print方法,在子类字节码文件中可以看出当子类print方法执行时x 变量并未进行赋值,x 变量在这时仅仅是编译时的0值,所以此时打印x 则会为0,执行完print方法之后,紧接着是为x 赋值为30,这时再次打印son.x则会是30,最后将son.x的值赋值为40
在这里插入图片描述

结果

       相信看过以上对于son和father字节码文件的讲解,应该已经可以解释打印结果的前两条s.x = 0 和s.x = 30的这两条数据,最后打印的s.x = 20是因为,java的动态连接是针对于方法的,对于属性则是不存在动态连接的,所以最后的s.x实则是打印的father.x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值