精华内容
下载资源
问答
  • 前几天,有个大佬考了我一个问题:为什么类的成员变量需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白...

    【套装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

    展开全文
  • 如果在定义变量后没有给它们赋初始值,那么java会给于一个默认的初始化值,但只有类的成员变量才被初始化,而局部变量不会被初始化。如果没有被初始化的变量被操作,java在编译器就会给予错误警告,如果没有被赋予...

    在java中变量是具有默认初始化值的。

    但这这么说也不怎么准确,因为java中的变量(我觉得称为字段更合适),分为属于类的成员变量和属于函数或者局部代码块的局部变量。如果在定义变量后没有给它们赋初始值,那么java会给于一个默认的初始化值,但只有类的成员变量才被初始化,而局部变量不会被初始化。如果没有被初始化的变量被操作,java在编译器就会给予错误警告,如果没有被赋予初值的局部变量,一直没被操作,则编译通过,java不会给予错误警告。

    除了变量的初始化外,新创建的类的引用也是一样,如果没有用new关键字给它分配对象的话,如果这个引用是属于类的成员字段则被默认初始化为null,如果在函数或者局部代码块内部,不会被初始化;

    java基本数据类型默认初始化表

    基本类型

    默认值

    char

    '\u0000'(null)

    byte

    0(byte 1字节)

    short

    0(short 2字节)

    int

    0(4字节)

    long

    0L

    float

    0.0f

    double

    o.od

    boolean

    false

    另外添加一个:类引用会被初始化为null

    下面,用一段代码测试一下:

    运行结果:

    1031ba93d18fbf68dbd8205253be730b.png

    这个结果就说明了,类测成员变量会被给予一个默认初始化值,类引用也会被初始化位nullvcD4KPHA+z8LD5rXEveG5+8rHyKW19MnPzsS0+sLr1tDK5LP2uq/K/bPJ1LGx5MG/JiMyMDU0MDu1xNPvvuSjrMbky/zDu9PQ1/a4xLavPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20131218/20131218093053283.jpg" alt="">

    从上面的报错信息我们不难看出,包含在函数中的成员变量或者类引用,都不会被默认给予初始化值。

    思考:

    java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的严重性错误,尽量从语法上避免程序员犯错。与之相反,C和C++,无论你对变量时候进行初始化,都可以对变量进行操作,这时变量中存储的是一串随机的数字(可能是上一个程序使用该内存空间后遗留的值,计算机中的数据不会被物理意义上的“擦除”,你对一块内存的写数据只是覆盖了这块内存的旧值而已。)。java编译器会将未初始化变量视为错误,而C/C++编译器则将其视为警告

    喜欢 (0)or分享 (0)

    展开全文
  • Java 局部变量初始化问题

    千次阅读 2018-06-08 09:05:49
    Java 中类的成员变量会被自动初始化,但是方法里头的局部变量不会被自动初始化   上图中 i 是成员变量,默认会自动初始化,所以直接使用没有报错。但是 j 是方法中的局部变量,没有初始化直接使用会出现编译...

    Java 中类的成员变量会被自动初始化,但是方法里头的局部变量不会被自动初始化

    code
      上图中 i 是成员变量,默认会自动初始化,所以直接使用没有报错。但是 j 是方法中的局部变量,没有初始化直接使用会出现编译错误。当然如果没有使用 j 而只是声明了却未初始化,那么只会有警告,因为编译器希望你接下来能对 j 进行初始化。

      注意:boolean 类型默认值是 false
    展开全文
  • 一、类的成员变量初始化 ---在JVM类加载阶段完成 类的成员变量又分为静态成员变量和非静态成员变量。 静态成员变量 静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二...

    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进行初始话开销较大;从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能

    展开全文
  • Java局部变量必须初始化

    千次阅读 2020-12-24 22:37:30
    Java中有两种变量,局部变量和成员变量。 成员变量可以进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。
  • Java 成员变量有初始值,而局部变量没有初始值。 如下所示,代码能编译通过 publicstaticvoidmain(String[] args){ String s; System.out.println("s="+s); } 转载于:...
  • Java全局变量和局部变量初始化问题

    千次阅读 2020-02-21 23:24:53
    我们先来看一个比较的例子,最近在知乎看到的帖子。... //类的成员变量 public static void main(String[] args) { TestDemo td =new TestDemo(); //默认的构造方法 System.out.println(td.a); ...
  • 局部变量定义后,必须初始化,即赋值,才能使用(它没有默认值)。 而类变量定义后可以不初始化,因为它有默认值。 类变量(实例变量):定义在类中,方法体之外。成员变量前面加 static 修饰符。 局部变量:定义在...
  • java局部变量初始化

    千次阅读 2018-07-15 00:51:42
    类变量有两次赋初始值的过程,一次在准备阶段,赋予系统初始值(如果被final修饰,初始值可能不是0或者null,false),另外一次在初始化阶段,赋予程序员定义的初始值,但是局部变量不一样,系统不会赋予初始值,除非...
  • java局部变量没有初始值,运行时会直接报错:java: 可能尚未初始化变量a,就算打印了也无济于事,还会报错。要解决的方法是: 给a赋初始值。注意:java中的局部变量一定要赋初始值。编译运行后就会在控制台会出现...
  • 转载:https://blog.csdn.net/qq_24644517/article/details/82288493 package deep; public class DefaultValue { // 实例成员变量 private boolean bool; private byte b; private short s; private ...
  • 类的属性,或者32313133353236313431303231363533e78988e69d8331333365633966叫值域方法里的局部变量方法的参数对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,...
  • java中的变量初始化问题

    千次阅读 2021-02-12 21:31:40
    方法的参数对于第一种称为类中的成员变量Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。以下是各种数据类型的默认值boolean false...
  • '\u0000'等),局部变量不会有默认初始值, public class test01 { private String s; private int [] year = new int[3]; public String getS() { return s; } public void setS(String s
  • Java成员变量: Java类在生成实例时, jvm会在Java堆中分配一块内存空间, 分配到的地址空间存储所有的成员变量, ...Java局部变量(个人理解) The local variable i may not have been initialized Jav...
  • 一个我们编写的java源码类(机器码)要想被正式运行...在这个过程中,我们会对我们定义的成员变量进行两次初始化,一次赋默认初值(0值,boolean赋为false),一次赋我们定义的初值,如: class Test{ int a = 2; }
  • 关于局部变量初始化

    千次阅读 2018-10-26 15:22:35
    我们经常被告知:在Java语言规定,局部变量必须要先初始化,然后才能使用。为什么呢? 首先 Java 语言就是这么规定的。其实无论成员变量还是局部变量都要初始化。只是JVM帮我们初始化了成员变量。 第一种解释: ...
  • java局部变量必须要初始化的原理

    千次阅读 2018-02-28 19:22:56
    问题可能很多java开发人员也没有注意到,java语言中的局部变量是必须要初始化的,但是这是为什么呢?...其实正是因为成员变量属于对象,而对象是保存在 堆中的,所以jvm就在初始化类的时候把成员变量初始化呢,而
  • 成员变量定义在方法外,类中。使用时可以不初始化(赋值操作),java编译器会根据其类型赋默认值,比如int i;...而局部变量使用时(注意是使用时,如果声明后使用它也是报错的)必须初始化,但方法中的形参除外。 ...
  • JAVA当中变量什么时候需要初始化?

    千次阅读 2021-03-02 11:11:34
    默认值如下:Boolean falseChar '\u0000'(null)byte (byte)0short (short)0int 0long 0Lfloat 0.0fdouble 0.0d2. 局部变量声明之后,Java虚拟机就不会自动...
  • Java中的成员变量分为两种:第一种是成员变量,第二种是...1.没有被修饰符修饰的成员变量和局部变量初始化java中所有的成员变量都会被系统赋予默认是初始值,这个初始值根据不同的数据类型有着不同的定义:Bool...
  • Java类的初始化变量初始化

    万次阅读 2018-06-02 15:21:23
    Java类的初始化变量初始化知识点Java常量, final 修饰,值被设定后能再被修改静态变量里, static 修饰,顾名思义,无须创建对象,便可在内存中申请一个存储空间进行存储成员变量, 也称实例变量,它随着当前...
  • 基本数据类型数值6类 (long/int/short/byte)(double/float) 非数值2类(char,boolean)下面是默认值:0/0/0/0/0.0/0.0/ /false首先 Java 语言就是这么规定的。然后为什么 Java 语言要这么规定...而成员变量就是类的数...
  • 此外,由于局部变量不会自动初始化,因此在为变量赋值之前,我能在变量周围包含if测试. 我想我可以在类的范围内为我的类中的每个方法创建一个变量,但是 管理它将是一个痛苦的管理. 如果我在每种方法中都包含以下内容...
  • Java中有两种变量,局部变量和成员变量。 成员变量可以进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。 int i;//为初始化 System.out.println(i);//...
  • java变量初始化

    千次阅读 2015-05-22 18:53:26
    java中的变量初始化,会出现什么问题呢,如果是基本数据类型,则会有初始值,如果不是,则一般是null,以下为测试结果 public class Test { String str; int a; char b; short s; float f; long lo; ...
  • ``` else if(e.getSource()==savedia){ String fname="error.txt",fcontent; FileOutputStream fout; File floc; SimpleDateFormat ...斜粗体的局部变量floc会有可能尚未初始化的错误,求大神解决
  • Java 变量一定要初始化吗?

    千次阅读 2020-03-02 20:02:42
    Java 变量一定要初始化吗?解答。。。
  • 在刚开始学习Java的时候,就了解了Java基础中的变量,虽然知道这个以后会经常用到,但没想到了基本语法这里,竟然又冒出来了成员变量和局部变量。变来变去太容易让人搞晕了,今天我们就挑拣出来梳理一下!
  • Java变量需要初始化吗?

    千次阅读 2019-11-21 10:35:35
    实例变量需要初始化局部变量必须初始化。 class Something { boolean i; public void doSomething() { System.out.println("i = " + i); int j; System.out.println(j);//会报编译错误 } } ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,338
精华内容 69,335
关键字:

java局部变量不初始化

java 订阅