`
aijuans
  • 浏览: 1544030 次
社区版块
存档分类
最新评论

java类中成员变量初始化后存放在堆内存中还是栈内存中?

 
阅读更多

答案是堆内存。

 

之前明明看过java类初始化过程的,

但一下子看到这样的题目,还是懵了。

百度后,那些帖子的回复各有各说,

脑袋都看得要塞住了,还是看书求证吧。

 

李刚的《疯狂Java》第128页开始,有一个类从初始化开始,

在内存发生什么变化的详细过程,这里简单记录一下。

1
2
3
4
class Person{
    String name;
    static int eyeNum;
}

 

上面这个Person类,有成员变量name和静态成员变量eyeNum了,

当执行下面语句:

1
2
3
4
5
6
Person p1 = new Person();
Person p2 = new Person();
p1.name = "A";
p2.name = "B"
p1.eyeNum = 2;
p2.eyeNum = 3;

 

  1. Person p1 = new Person();第一次使用Person类,系统在堆内存为Person类分配空间,其中也包括了静态成员变量eyeNum(初始值为0)。

  2. 然后,在堆内存new一个Person对象,其中name为null,然后将p1指向这个对象。

  3. 接着new p2时,因为类已经初始化了,只需重复第2步就行了。

  4. p1.name = "A"; 让堆内存中p1对象的name指向一个"A"字符串。

  5. p1.eyeNem = 2;此时通过Person对象修改Person的类属性(因为是静态成员变量),Person类的eyeNum属性被赋值为2。

     

      Person类            
      eyeNum →2            
p1 ------ -- ---------------- ---        
    第二个Person对象     第一个Person对象      
p2 ------   name → "B"   name → "A"    
                   
栈内存            

 

 

画的很难看,不过大概就是上面这样。

 

欢迎大家访问我的个人网站 萌萌的IT人
3
1
分享到:
评论

相关推荐

    java实现内存动态分配

    虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放...

    建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。

    还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:...

    Java提高篇之关键字static

     Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和...

    java堆栈的区别 -- 详解

    另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活 2.5堆和栈中的存储内容 栈: 在函数调用时,...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义了一个 Point 类 ,并且声明了它的两个变量 x、y 坐标 ,同时实现 init()方法 对 x、y 赋初值 。 class Ponit { int...

    Java复习题及答案

    3、所有类至少有一个构造器,构造器用来初始化类的新对象,构造器与类同名,返回类型只能为void。 ( ) 4、包是按照目录、子目录存放的,可以在程序中用package定义包,若没有package一行,则表示该文件中的类不...

    [java]读书笔记整理:一切都是对象

    用堆进行存储分配比用堆栈进行存储分配需要更多的时间(如果确实可以在java中向在C++中一样在栈中创建对象)。 4) 静态存储 这里的“静态”是指“在固定的位置”(尽管也在RAM里)。静态存储里存放程序运行时一直...

    高斯投影坐标正反算

    Zhengsuan.h和Zhengsuan.cpp用于存放Zhengsuan类,在Zhengsuan类中声明了高斯投影坐标正算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及正算计算。通过get函数获得相应的正算结果。 Fansuan.h和...

    【04-面向对象(上)】

    •与成员变量不同的是除了形参外,其他局部变量都必须显式地初始化, •Java 里允许局部变量和成员变量重名。这样局部变量会覆盖成员变量,这时通过this 来调用实例的属性. 成员变量的初始化 •当类被加载时,...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    6.2.1 在类中给每个变量一个初始值 147 6.2.2 定义自己的引用 147 6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    6.2.1 在类中给每个变量一个初始值 147 6.2.2 定义自己的引用 147 6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车...

    函数、内存、一维数组、二维数组

     数组和对象,通过new建立的实例都存放在堆内存中。  每一个实体都有内存地址值  实体中的变量都有默认初始化值  实体不在被使用,会在不确定的时间内被垃圾回收器回收 方法区,本地方法区,寄存器 ...

    Java 关键字、标识符、注释、常量与变量、数据类型,算术、赋值、比较、逻辑、位、三元运算符和流程控制、break、continue

    •数据类型 变量名 = 初始化值; •注:格式是固定的,记住格式,以不变应万变。 理解:变量就如同数学中的未知数。 变量字节大小及有效取值范围 byte占用一个字节,数字大小为-27—27-1 short占用两个...

    Java测试题4答案

    ”)中out是System 类的一个成员变量。( ) 四、简答题 1、 通过继承,子类可以获得哪些好处? 2、 写出程序包组织Java程序的好处? 五、程序分析题 阅读下列程序,然后回答问题。 class Car { ...

    【03-流程控制与数组】

    实际的数组元素是存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存 中。 •如果堆内存中数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占的内存将会...

    基于JAVA的搜索引擎 lucene-2.2.0

    必须深入地理解IndexWriter索引器初始化的过程,以及在构造一个IndexWriter索引器过程中涉及到的一些其他的类,应该深入研究这些相关的类的定义。这样才能有助于深化IndexWriter索引器构造的原理机制。 可见,...

    值类型和引用类型的区别

    引用 类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像您的银行账号一样。具体哪些类型是值类型哪些是引用类 型,大家翻翻书,背一背就好了,不过我想,做过一段时间...

    Java精华(免费版)

    String类一旦初始化就不可以改变,而stringbuffer则可以。它用于封装内容可变的字符串。它可以使用tostring()转换成string字符串。 String x=”a”+4+”c”编译时等效于String x=new StringBuffer().append(“a”)...

Global site tag (gtag.js) - Google Analytics