内存分析 这次学习Java,第一次接触内存中的程序的具体执行过程。感觉理解内存中数据的进出对程序的理解确实很有帮助。
Java的执行过程在内存中一共占四个区域:
heap (堆)区:用来存放new出来的东西,是一个对象的真正存放位置。堆用于动态分配和释放程序所使用的对象。
stack (栈)区:用来存放局部变量,一般是对象的引用。
data segmeng 区:用来存放静态变量和字符串常量(只是常量,new出来的String对象还是在heap中)。
code segment 区:存放要执行的代码(函数,语句)。
执行步骤:程序开始执行使,首先将要执行的代码从硬盘Load到内存中的code segment区中,然后找到main方法开始执行,执行过程根据语句中的变量的类型分配不同的内存空间。
举例:
程序代码:
view plaincopy to clipboardprint?
- public class Cat{
- private static int sid=0;
- private String name;
- int id;
- Cat(String name){
- this.name=name;
- id=sid++;
- }
- public static void main(String[] args){
- Cat.sid=100;
- Cat mimi=new Cat("mimi");
- }
- }
public class Cat{ private static int sid=0; private String name; int id; Cat(String name){ this.name=name; id=sid++; } public static void main(String[] args){ Cat.sid=100; Cat mimi=new Cat("mimi"); }} 执行过程,1 将代码加载到code segment区,
2 开始执行main方法,在data segment中创建静态变量sid,值为100,
在栈中创建局部变量"mimi”,其指向堆的的真正new的对象。在data segment中创建字符常量"mimi"。
3 开始执行构造函数,Cat有一个参数,是局部变量,所以在栈中创建局部变量"name",其指向data segment中的"mimi",在堆中创建mimi的真正内容,包括name,也指向data segment中的"mimi", 还有id,值为100,然后data segment中的sid+1=1=101。构造函数执行结束,释放栈中的局部变量name。
内存如图:
4 然后回到main函数,main函数结束。释放所有内存。
Java也是三大控制结构:顺序,选择,循环
分支语句:
(1)if条件语句
if(){..}
if (){...} else{...}
if(){...}elseif() {...}
if(){...}elseif(){...}elseif(){...}
if(){...}elseif(){...}elseif(){...}else{...}
当if或else的执行体只有一条语句时,可以省略{}。
(2)switch 语句
switch(index){
case int;
...
break;
case int;
...
break;
default:
...
}
注:JDK7之前,index 只能是byte,short,int,char,enum类型的值。JDK7可以使用String类型。
(3)三目运算符:X ?Y:Z(例如:x==0?0:-1)
循环语句:
(1)for语句: for(...;...;){...}
(2)while语句:while(逻辑表达式){...}
(3)do while 语句:do{...}while(逻辑表达式);
Java的条件和循环语句与c语言和c#的书写方式基本相同。另外循环中的break和continue也没有特殊用法,不再赘述。
|