java 成员变量为什么可以不初始化而局部变量必须初始化

  对于java虚拟机内存这块始终有点迷,今天又把深入理解jvm虚拟机拿出来翻了翻,理了理java内存区域。

  ava虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存放局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。这句话就说明了局部变量在创建时就必须进行初始化以确定分配内存大小。

  java堆存放所有对象的实例,几乎所有的对象实例都在这里分配内存。在hotspot虚拟机中,内存分配后,虚拟机需要将分配到的内存空间都初始化为零值。这一步操作保证了对象的实例字段在java代码中可以不赋初始值就直接使用,程序能访问到的这些字段的数据类型所对应的零值。

原文地址:https://www.cnblogs.com/Lets-goo/p/8998014.html

时间: 2024-08-03 15:37:07

java 成员变量为什么可以不初始化而局部变量必须初始化的相关文章

Java成员变量与属性的区别,简单最易懂的解释!!!

例一: 一个Student pojo类: public class Student{ private String name; private int age; public String getName(){ return this.name; } public void setName(String name){ this.name = name; } public int getAge(){ return this.age; } public void setAge(int age){ t

java 成员变量 静态成员变量 方法 静态方法初始化顺序

Java构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类

java成员变量和局部变量的初始化和内存中的运行机制

成员变量: 当系统加载类或创建类的实例时,系统会自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值. eyeNum是类属性.name是实例属性 所有person实例访问eyeNum都将访问person类的eyeNum属性.访问的是同一块内存.如果通过实例修改类属性,所有实例访问时都会改变. 局部变量: 局部变量定义后,必须经过显示初始化才能使用.这意味着定义了局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋值初始值时,系统才会给局部变量分配内存,并将初始

java 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块

①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 另一种没有static修饰,为成员变量 ②通俗点说: 类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享.静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期. 而实例变量取决于类的实例.每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期. 注意点: 1.JAVA中初始化

java成员变量与局部变量修饰符的区别

成员变量: 可以被 public,static ,protected,default,final修饰. 局部变量:包括方法里的和 代码块里的(静态和非静态) 可以被default, final修饰 参考: 百度搜索:代码块与成员变量 java中静态代码块中初始化静态成员变量 分享| 2015-12-31 22:18 ∮老男孩丶 | 浏览 56 次 悬赏:5 javastatic{ age = 2; }static int age = 4; 我把声明age的语句放到代码块后面,为什么没报错,执行代

4.Java成员变量和成员方法

成员变量 成员变量是指类的一些属性定义,标志类的静态特征,它的基本格式如下:    访问修饰符 修饰符 类型 属性名称=初始值; 访问修饰符:可以使用四种不同的访问修饰符中的一种,包括public(公共的).protected(受保护的),无修饰符和 private(私有的).public 访问修饰符表示属性可以从任何其它代码调用.private 表示属性只可以由该类中的其它方法来调用.protected 将在以后的课程中讨论. 修饰符:是对属性特性的描述,例如后面会学习到的:static.fi

java 成员变量与局部变量

成员变量: A:在类方法外 B:在堆内存中 C:随着对象的创建而存在,随着对象的消失而销毁 D:有默认的初始化值 局部变量: A:在方法定义中 B:在占内存中 C:随着方法的调用而存在,随着方法的调用完毕而销毁 D:没有初始化的值,使用前必须定义和赋值 匿名调用的好处: 调用完毕后就是垃圾,可以被垃圾回收起器回收

JAVA成员变量为什么不能在类体中先定义后赋值

1 package dx; 2 3 public class Test1 { 4 5 int a111;//定义成员变量(全局变量) 6 7 8 9 // a = 1;//此处若给变量赋值,会报错,JAVA所有的除定义或声明语句之外的任何语句都必须在方法内部(而方法又必须在某个类内部,不存在游离于类外部的方法或成员) 10 11 12 13 public static void main(String[] args) { 14 // TODO Auto-generated method stub

JAVA成员变量的隐藏

一.如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子: public class A { public int x=10; } public class B extends A { public int x=20; } public class C { public static void main(String[] args) { A a=new B(); System.out.println(a.x); //1 B b=new B();

java 成员变量在内存中的存储过程

上面代码的运行结果: 1). 首先看第三行: Person p01 = new Person(); 等号左边创建类"Person"的一个变量"p01"(在内存的栈空间中创建一个“p01”): 等号右边会在堆空间中开辟一块区域来存放“p01”的,并且把地址传给“p01”: 目前类中的成员变量初始值都是默认值:1. byte/short/long/int类型的默认值为“0”:2. char类型的默认值为“空格”: