1.内存解析:众所周知“内存”是在应用程序运行时存放数据的空间,主要存放程序运行时要处理的数据。在这里我主要是对面向对象这些语言在运行的时候数据怎样在内存中处理谈谈自己的理解。
2.内存中数据处理的过程
1)c++,c#,java这类面向对象语言的数据类型主要有两类:
基本类型(4类8种):
整型,int,short,long,byte
浮点类型,float,double
字符类型,char
类型,boolean
引用类型(比如常用的String,数组,和对象类型)。
2)在程序运行的时候根据程序所处理数据类型的不同又被分成三部分:栈,堆,data segment(数据区)。
栈:存放非静态变量的值和指向存放在堆中的引用类型的指针
堆:存放引用类型的值或者是对象的值。
数据区:存放静态变量的值和字符(串)常量以的值。
3)在程序运行时将基本类型变量的值存入栈中,一旦将此变量的值赋给另一个变量或者将这个变量输出后那么这个基本类型变量便会自动从内存单元中释放(这一过程是在执行环境中自动处理的java中对应的是java虚拟机JVM)。
4)在程序运行时指向引用类型变量的指针会存放在栈中,而环境也会自动为它在堆中开辟一块存放该变量值的区域,栈中的地址指向堆中的内容。而程序对引用类型的操作其实是操作存放在栈中的地址而不是堆中的数据(嗯,明白这点很多问题便豁然开朗,哈哈)
5)
现在来说说要重视的第三块区域,数据区。上面说过数据区中存放静态变量和字符串常量,既然我们讨论的是面向对象编程,那么我们定义的static静态变量
一般也是在对象中,如果是非静态变量的话一旦我们new一个对象那么在堆中会为其分配存放变量值的内存块,而且new多少不同的对象就会有多少这个变量。
但是静态变量特殊的地方是他不会因为new的不同对象的个数而个数增加,因为他是静态的数据区内只有一个。而且不会因为赋给某个变量或者输出而释放,只有在应用程序结束的时候才会释放。一般用静态变量做计数器用。
到这里基本上程序在运行时内存中的数据变化过程我理解的就是这样。有种想要了解C语言和面向对象语言的区别的冲动。