• 关于成员变量和局部变量是否都会被默认初始化的问题


    成员变量可以不用初始化,其具有默认值;但是局部变量一定需要初始化或者赋值后才能使用,否则编译报错。

    public class Demo {
        int m;
        public static void main(String[] args) {
            Demo demo = new Demo();
            System.out.println(demo.m); //输出0
        }
    }
    
    public class Demo {
        public static void main(String[] args) {
            int m;
            System.out.println(m); //报未初始化错误
        }
    }

    1. 首先 Java 语言就是这么规定的。
    2. 然后为什么 Java 语言要这么规定呢?有什么内部机理吗?
    可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。
    而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。
    那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。

    for (int i = 0; i < 10; i++) {
        int n;
        if (i % 2 == 0) {
            n = 10;
        } else {
            n = 20;
        }
    }

    像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)

    转自知乎:点击打开链接

  • 相关阅读:
    国家标准比例尺地形图说明(摘要自SuperMap Objects Document)
    常用日期函数
    CMD执行BCP命令
    如何利用.snk文件生成DLL文件中的Publickeytoken
    SQL SERVER数据库的表中修改字段属性被阻止“Prevent saving changes that require table recreation”
    如何生成DLL文件
    如何反编译DLL文件
    Visual Studio 2022激活密钥
    sqlserver跨数据库查询
    jQuery对象与DOM对象之间的转换
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9386235.html
Copyright © 2020-2023  润新知