精华内容
下载资源
问答
  • 局部变量若不初始化
    千次阅读
    2021-02-07 15:47:26

    1、成员变量

    成员变量有默认初始值,而方法内的局部变量却没有初始值。这个问题涉及到JVM类加载字节码执行两个阶段,这两个阶段是依次执行的。

    JVM类加载是JVM利用类加载器将class文件加载到JVM的过程,涉及“加载”、“验证”、“”准备“、“”解析“和”初始化“。
    一、类的成员变量初始化   ---在JVM类加载阶段完成

    类的成员变量又分为静态成员变量和非静态成员变量。

    静态成员变量

    静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二次在“初始化”阶段,根据代码中的赋值情况再进行一次初始化。

    例如:

    public static int i =3 ;

    第一次初始化后i的值为0,第二次初始化后,值才为3.

    数据最终存放在方法区中。

    非静态成员变量

    仅“初始化”阶段赋值。根据代码中的赋值情况,代码不赋值直接赋默认值,有赋值则等于代码中的赋值。对象实例化后,该变量随java对象分配到java堆中。

    2、局部变量

    当我们新建一个对象时,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实现起来也更容易!!!)

    3、总结

    套用《Thinking in Java》作者Bruce Eckel的话

    编译器当然可以为局部变量附一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽,所以采用默认值范围会掩盖这种失误。因此强制程序员提供一个初始值,往往能够帮助找出程序里的缺陷。

    总结一下,为什么局部变量需要手动初始化?从技术上来讲,局部变量一般来说总量大,生命周期短,JVM进行初始话开销较大;从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能

    更多相关内容
  • C语言中,未初始化局部变量到底是多少? 答案往往是: 与编译器有关。 可能但保证初始化为0。 未确定。 总之,全部都是些一本正经的形而上答案,这很令人讨厌。 但凡一些人给你滔滔不绝地扯编译器,C库,...
  • 前几天,有个大佬考了我一个问题:为什么类的成员变量需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白...

    【套装4本】java编程思想4第4版+

    402.5元

    包邮

    (需用券)

    去购买 >

    f22ce081e36827da908204eacd0e31c8.png

    前几天,有个大佬考了我一个问题:为什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?

    说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白一点了。

    首先我给出一个具体的场景来说明这个事情:

    bVbEQrW

    定义一个Cat类,里面有各种属性,包括8大基本数据类型和String类型,我们把String类视为复杂数据类型。Cat类里面有一个setAge方法。我们在main方法里面给tom这个Cat赋值年龄,结果发现,如果给定的年龄没有赋初始值,编译器会报错:

    bVbEQss

    那我们来看下未给Cat里面的各种属性初始化,各项属性的初始值究竟是怎样的:

    重写一下toString方法:

    bVbEQtd

    然后输出结果为:

    bVbEQtu

    我们能够看到,对于8大基本类型的初始化已经实现了,分别是如图所示的值。对于复杂的类,会赋予null作为默认值。(这里char的默认值为'/u0000'也就是null)

    那么问题来了,为什么Java会有这样的操作呢,为什么不能将方法内的局部变量也自动赋值一个默认值呢?

    首先,我在网上找到了这样的一个答案如下,如果不想看原文,可以直接跳过至引用答案的结尾处直接看我的总结:

    这位作者在读《深入理解Java虚拟机》的时候记录了一个相关知识点。

    类的成员变量有默认初始值,而方法内的局部变量却没有初始值。这个问题涉及到JVM类加载和字节码执行两个阶段,这两个阶段是依次执行的。

    JVM类加载是JVM利用类加载器将class文件加载到JVM的过程,涉及“加载”、“验证”、“”准备“、“”解析“和”初始化“。

    一、类的成员变量初始化   ---在JVM类加载阶段完成

    类的成员变量又分为静态成员变量和非静态成员变量。

    静态成员变量

    静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二次在“初始化”阶段,根据代码中的赋值情况再进行一次初始化。

    例如:

    public static int i =3 ;

    第一次初始化后i的值为0,第二次初始化后,值才为3.

    数据最终存放在方法区中。

    非静态成员变量

    仅“初始化”阶段赋值。根据代码中的赋值情况,代码不赋值直接赋默认值,有赋值则等于代码中的赋值。对象实例化后,该变量随java对象分配到java堆中。

    二、方法区的局部变量没有初始化

    而方法中的局部变量没有初始化步骤,如下图:

    bVbEQtU

    需要在代码中进行初始化。

    bVbEQtV

    ————————————————

    原因就是类方法中的代码,实在字节码执行的时候,才会被运行到,此时局部变量是存储在虚拟机栈-栈帧中的局部变量表中。局部变量定义了但是没有赋值是不能使用的。

    版权声明:本文为CSDN博主「一步一台阶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/liufang...

    这篇帖子主要是说明了两种变量在JVM编译代码的时候把他们放在了哪里。

    JVM加载类的时候,不管是静态类还是非静态类,都会给每个类分配内存,存在堆里面,都有初始化的这一步操作。

    对于方法内的局部变量,由于方法要放到堆栈中(堆栈这个词,其实意义就是栈,习惯称为堆栈,其实和堆没关系),只有字节码执行的时候才会被运行到,所以没有赋值是不能使用的。

    ………………??? 这是什么意思?也就是说,两种变量的存储位置不一样,会对是否初始化有影响,但是没有说明为什么成员变量在堆里就有初始化,方法内局部变量为啥放在堆栈里面,只有执行方法的时候才会被运行到就不能初始化呢?

    然后我就找到另一篇文章如下:

    为什么 Java 中全局变量不一定初始化,局部变量必须初始化?

    作者:Intopass

    链接:https://www.zhihu.com/questio...

    来源:知乎

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    首先 Java 语言就是这么规定的。

    然后为什么 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实现起来也更容易!!!)

    通过看这位作者的讲解,我们就能够理解得更清楚一些了。为什么堆内的成员变量可以初始化?因为容易,申请内存的时候顺便就实现了初始化。为什么栈内的局部变量不能初始化?因为麻烦,而且没有必要。

    最后,我又看到了一个内容,同知乎页面另一个匿名作者的回答:

    套用《Thinking in Java》作者Bruce Eckel的话

    编译器当然可以为局部变量附一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽,所以采用默认值范围会掩盖这种失误。因此强制程序员提供一个初始值,往往能够帮助找出程序里的缺陷。

    其实我觉得这句话应该是对于为什么局部变量不能够初始化的最合理的解释了吧。

    总结一下,为什么局部变量需要手动初始化?从技术上来讲,局部变量一般来说总量大,生命周期短,JVM进行初始话开销较大;从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能。一举三得,何乐而不为?

    回到开头,所以说大佬就是大佬,随随便便问一个问题,看似是一个小问题,但是深究下去竟然牵扯到这么多深层次的知识点,甚至有点哲学的意义在里面,佩服佩服!

    java 11官方入门(第8版)教材

    79.84元

    包邮

    (需用券)

    去购买 >

    f0f3f55624fb396b1764d42d6df88864.png

    展开全文
  • 局部变量定义后,必须初始化,即赋值,才能使用(它没有默认值)。 而类变量定义后可以不初始化,因为它有默认值。 类变量(实例变量):定义在类中,方法体之外。成员变量前面加 static 修饰符。 局部变量:定义在...
    • 成员变量:定义在类中,方法体之外。
    • 局部变量:定义在方法体,构造方法,语句块中的变量。

    局部变量定义后,必须初始化,即赋值,才能使用(它没有默认值)

    public class Demo{                                              
    	public static void main(String[] args){
    		int i;  //没有赋值
    		System.out.println("i is" + i);
    	}
    } 
    

    编译结果:
    在这里插入图片描述

    成员变量定义后可以不初始化,因为它有默认值

    变量类型默认值
    int,byte,short,long0
    char一个空格
    float,double0.0
    引用值(比如String)null
    public class Demo{    
    	//成员变量(更准确说是:静态变量)不初始化
    	static int x1;             
    	static byte x2;
    	static short x3;
    	static long x4;
    	static String x5;//String是用引用值,引用值都是null
    	static char x6;
    	static float x7;
    	static double x8;                             
    	public static void main(String[] args){
    		System.out.println("x1 is " + x1);//int:0
    		System.out.println("x2 is " + x2);//byte:0
    		System.out.println("x3 is " + x3);//short:0
    		System.out.println("x4 is " + x4);//long:0
    		System.out.println("x5 is " + x5);//String(引用值):null
    		System.out.println("x6 is " + x6);//char:空格
    		System.out.println("x7 is " + x7);//float:0.0
    		System.out.println("x8 is " + x8);//double:0.0
    	}
    } 
    //但是它编译成功,运行结果可以看出 成员变量有默认值,并且是各个类型类变量的默认值
    

    实例提示: 演示代码是为了方便,直接在main中调用该类的静态变量(成员变量前加statis)

    在这里插入图片描述
    不过还有一个问题,char型类变量的默认值到底是啥,上图看不出来啊

    做个代码实验:

    public class Demo{    
    	static String x5;
    	static char x6;          
    	public static void main(String[] args){
    		System.out.println("x5 is " + x5 + "haha");
    		System.out.println("x6 is " + x6 + "haha");
    	}
    } 
    

    看下图,可以看出char型类变量的默认值是' ',确定是个空格
    在这里插入图片描述

    展开全文
  • 全局变量有时也需要初始化,而局部变量其实大部分时间都没有初始化。不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/...

    满意答案

    02ae427d08e371d7e90d5b995e828d6d.png

    ccc000267

    推荐于 2017.11.23

    02ae427d08e371d7e90d5b995e828d6d.png

    采纳率:52%    等级:8

    已帮助:712人

    这个说法本身就不对。变量需要不需要初始化是根据需要来进行的。全局变量有时也需要初始化,而局部变量其实大部分时间都没有初始化。不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/C++代码实现的,程序开始执行后才给变量赋的值。只是全局变量如果不显式初始化,那么编译时由编译器自动初始化为0,而编译器对局部变量是否有值视而不见,所以在程序开始执行前局部变量的“值”是机器垃圾。因此,局部变量在获得初值前若当右值使用就要出问题!局部变量获得初值有两个途径:一是初始化,如int x=3;就是在声明x的类型时同时初始化为3——x==3这个值在编译时就被编译器确定了,程序启动后不再执行int x=3;这种操作;二是赋初值,如int x;x=3;,int x;在编译时执行,只声明了变量类型,值是垃圾,x=3;是C/C++语句,每次启动程序都要执行,将变量x赋值为3。所以,说“局部变量其实大部分时间都没有初始化”,就是指我们创建函数时往往只写int a,b,c,x,y,z;而并不给每个变量都初始化一个确定的值,而是在使用前给它们赋初值,如紧接着写scanf("%d%d%d",&a,&b,&c);或for(x=0;x<10;x++){...}(其中x=0是给x赋初值)等。

    40分享举报

    展开全文
  • 关于成员变量和局部变量初始化

    千次阅读 2022-01-26 14:34:38
    成员变量为什么可以不用初始化,而局部变量就必须要初始化
  • 如果在定义变量后没有给它们赋初始值,那么java会给于一个默认的初始化值,但只有类的成员变量才被初始化,而局部变量不会被初始化。如果没有被初始化的变量被操作,java在编译器就会给予错误警告,如果没有被赋予...
  • Java中局部变量必须初始化

    千次阅读 2020-12-24 22:37:30
    Java中有两种变量,局部变量和成员变量。 成员变量可以进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。
  • 全局变量和局部变量初始化问题

    千次阅读 2019-08-23 16:08:42
    这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用了,后面会验证。现在,我们要讨论的是程序猿或者程序媛需需要给全局变量和局部...
  • C语言未初始化局部变量是多少?

    千次阅读 多人点赞 2020-07-17 17:41:15
    C语言中,未初始化局部变量到底是多少? 答案往往是: 与编译器有关。 可能但保证初始化为0。 未确定。 总之,全部都是些一本正经的形而上答案,这很令人讨厌。 但凡一些人给你滔滔不绝地扯编译器,C库,...
  • Java成员变量: Java类在生成实例时, jvm会在Java堆中分配一块内存空间, 分配到的地址空间存储所有的成员变量, ...Java局部变量(个人理解) The local variable i may not have been initialized Jav...
  • 在C语言中使用未初始化局部变量

    千次阅读 2021-05-20 04:17:14
    在C语言中使用未初始化局部变量我知道这意味着加仑的价值被认可。为什么加仑升功能没有为加仑设置一个值,以便转换函数具有该值。任何帮助赞赏感谢...代码:double take_Input(void){double a, b, c, d;double ...
  • 2.局部变量数组未初始化,则其默认值为-858993460(垃圾值); 全局变量、静态变量处于数据区,未初始化,默认值为0 。 局部变量处于堆栈区,其数值是随机的,即当时内存中的值。 // test.cpp: 定义控制台应用程序的...
  • 关于局部变量初始化

    千次阅读 2018-10-26 15:22:35
    我们经常被告知:在Java语言规定,局部变量必须要先初始化,然后才能使用。为什么呢? 首先 Java 语言就是这么规定的。其实无论成员变量还是局部变量都要初始化。只是JVM帮我们初始化了成员变量。 第一种解释: ...
  • 当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch一条长语句需要换行写,可以在行的末尾加入反斜杠 表示;...变量有全局变量、局部变量,全局变量系统默认初始化局部变量不会自...
  • C++局部变量和全局变量的初始化

    千次阅读 2020-03-02 23:17:18
    局部变量被定义时,系统不会对其初始化,此时局部变量的初始值未定义,必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
  • 静态局部变量初始化

    千次阅读 2019-03-07 11:17:06
    原以为会每次调子函数时,都会初始化静态局部变量。实际并非如此 #include void key(void) { //static unsigned char key_up =1; unsigned char key_up =1; printf("key_up = %d \n", key_up); key_up = ...
  • 1.成员变量自动初始化对于类的成员变量。不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值public class Copy { static String s; public static void main(String[] args)...局部变量必须手动初
  • 如上图所示, 1、全局int变量(包括有static前缀的)未初始化,默认值是0。 2、局部int变量未初始化,默认值未知。...解释:局部变量是存在栈中,数据量大,且生命周期短,局部变量进行初始化,开销很大。 ...
  • 1、实践是检验真理的唯一标准,废话多说,上代码。 #include <QCoreApplication> #include <iostream> using namespace std; // 定义变量类 class Variable { public: Variable(const string&...
  • 基本数据类型数值6类 (long/int/short/byte)(double/float) 非数值2类(char,boolean)下面是默认值:0/0/0/0/0.0/0.0/ /false首先 Java 语言就是这么规定的。然后为什么 Java 语言要这么规定...而成员变量就是类的数...
  • C语言中变量初始化的处理

    千次阅读 2022-02-11 10:44:46
    实例测试1--DEV-C++环境 : #include <stdio.h> //全局整形变量 int int_var1; static int stc_int_var1;... //局部整形变量 int int_var2; static int stc_int_var2; short int sht_int_var2
  • C++未被初始化局部变量

    千次阅读 2017-02-16 09:23:12
    而没有初始化保存变量(或初始化为0的静态变量、全局变量)其默认值为0,没必要将这些值均为0的变量存储在data段中,而采用bss段只是给未初始化的全局变量局部静态变量预留位置,bss段并没有内容。但是在程序执行...
  • c++全局变量和静态局部变量初始化的时间 1.全局变量初始化在主函数之前 2.静态局部变量初始化在第一次调用这个静态局部变量之前 #include <iostream> using namespace std; class A { public: A(int a):m_a...
  • C++有个人所共知的特性,就是它的内置类型是无法在局部区域内默认初始化的。如下所示 int k; int main(){ int m; cout&lt;...错误 C4700 使用了未初始化局部变量“m” c++primer上...
  • (1)C语言从语法上规定全局变量只能用常量表达式来初始化,因此下面这种全局变量初始化合法的: int minute = 360; int hour = minute / 60; (2)如果全局变量在定义时初始化则初始值是0,如果局部...
  • java中局部变量必须要初始化的原理

    千次阅读 2018-02-28 19:22:56
    问题可能很多java开发人员也没有注意到,java语言中的局部变量是必须要初始化的,但是这是为什么呢?...其实正是因为成员变量属于对象,而对象是保存在 堆中的,所以jvm就在初始化类的时候把成员变量初始化呢,而
  • Java中有两种变量,局部变量和成员...成员变量可以进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。 int i;//为初始化 System.out.println(i);//编译器报错
  • 它的存储空间是连续的,两个紧密挨着定义的局部变量,它们的存储空间也是紧挨着的。栈的大小是有限的,在 Linux 中可以通过命令 ulimit -s 查看默认栈空间大小,默认情况下为 8192 KB(即 8MB)。因此如果在程序内部...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 409,625
精华内容 163,850
关键字:

局部变量若不初始化