zoukankan      html  css  js  c++  java
  • 成员变量与初始化块

        

    public class A {
    public int number = 5;
    {
    number = 10;
    }
    public static void main(String[] args) {
    A a = new A();
    System.out.println(a.number);
    }
    }

    这段代码的执行结果是a的值是10;下面将初始化块和成员变量交换一下顺序让成员变量在后面

    public class A {

    {
    number = 10;
    }
    public int number = 5;
    public static void main(String[] args) {
    A a = new A();
    System.out.println(a.number);
    }
    }

    这个执行的结果是5;

    那么到底number的值是什么,关键在于给他赋值的语句最后一个是什么,当第一种情况number最后赋值是10所以最后被赋值的就是10,第二种情况number最后被赋值为5,所以最后number的值是5.当然这样说简直是扯淡。其实他的原理是:

      我们看到的代码其实虚拟机执行的时候并不是按照这个顺序,我们的成员变量和初始化块都会加载到构造方法里边,加载的顺序是按照代码的顺序,当成员变量在前面初始化块在后面的时候,那么最后被赋值是按照初始化块的值来决定的,因为先给成员变量赋值,然后又执行初始化块内的代码,又对number在赋值,所以最后的结果就是初始化块内的代码。

      但是,如果初始化块在前面,成员变量在后面,那么将二者加载到构造方法里面时,先执行初始化块内的代码对变量赋值,在执行成员变量的赋值,最后初始化块内的代码被成员变量赋值给覆盖掉了,所以最后的结果就是成员变量的值。

  • 相关阅读:
    (78) C# System.Text.Json
    EF 迁移数据库
    element table
    element-plus 安装
    asp.net core 跨域
    JS常用公共方法 获取弹出层合适的宽高
    一篇文章让你搞懂如何通过Nginx来解决跨域问题
    Dubbo系列讲解之服务注册【3万字长文分享】
    Dubbo系列讲解之扩展点实现原理分析【2万字分享】
    MySQL索引篇之索引存储模型
  • 原文地址:https://www.cnblogs.com/sandwichforworld/p/5658915.html
Copyright © 2011-2022 走看看