Java程序编译与运行
粗浅地记录Java程序的编译和运行
众所周知,Java的跨平台性,“一次编译,到处运行”,其本质是:Java程序运行在JVM中,所以在不同的平台上只需要安装相应平台的JVM即可。接下来就记录我对Java程序编译运行的粗浅的理解…
关于概述
编译与运行流程图
1、通过 javac命令 将 .java 文件编译成 .class 文件 并存放在 本地硬盘 中
2、通过 java命令 运行 .class文件(注意:是在JVM中运行的)
关于内存空间
JVM架构图
我把内存空间(也叫:运行时数据区)简单的理解成三部分: 栈、堆、方法区
栈: 用于存放 基本数据类型的值 和 对象及数组的引用变量
堆: 用于存放 类的实体(new出来的东西)、数组的值 和 方法区中某些类型值得引用变量
方法区: 用于存放 每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量 和 编译器编译后的代码 等
引用变量:就是我们声明的变量的名称,如:
String str = "Hello world!";
str 就是传说中的引用变量,在写程序时,想要使用 “Hello world!”这个字符串时,直接使用它的引用变量 str 即可。(类似引用变量这样的名词还有:字段,变量名,句柄…具体的可自行搜索看看)
System.out.println(str);
引用变量,便于我们在程序中使用某些数据,它是某中数据类型的数据在内存中分配的空间的首地址的别名,如:
int a = 1;
在内存里的地址为:0x0000000 的地方开始,开辟一个int类型大小的空间,(int 4个字节),到 0x0000004处结束,首地址是0x0000000,所以a的值就是0x0000000,当我们在程序中使用a时,就会找到 0x0000000 所在位置的数据 1 ;
关于图示
栈 和 方法区 的数据是共享(数据共用,如果存在,便再创建)的
上述图示是简单的理解,感觉比较浅显,大概的示意图…具体的以后会仔细研究
关于实例
public class Demo {
public static void main(String[] args) {
int A = 1;
int B = 1;
int C = new Integer(1);
System.out.println("A==B ————> "+(A == B));
System.out.println("A==C ————> "+(A == C));
String D = "Hello world!";
String E = "Hello world!";
String F = new String("Hello world");
System.out.println("D==E ————> "+(D == E));
System.out.println("D==F ————> "+(D == F));
}
}
运行结果
A==B ————> true
A==C ————> true
D==E ————> true
D==F ————> false
解析
int 是基本数据类型,其数据存放在栈中,并且数据是共享的(数据共用,如果存在,便再创建) int A = 1;//首先在栈中查找是否存在一个这个数据,发现没有,然后在栈中开辟一个int大小的空间,假设起始地址是:0x0000000,那么A=0x0000000; int B = 1;//在栈中查找是否存在一个这个数据,发现存在,那么便让 B=0x0000000; int C = new Integer(1);//int 基本数据类型,数据存放在栈中,并且数据共享,所以 C=0x0000000; System.out.println("A==B ————> "+(A == B));//两者相同,true System.out.println("A==C ————> "+(A == C));//两者相同,true
String 不是基本数据类型,它是一个final类,其数据存放在方法区中的String常量池中,并且数据是共享的(下次整理Java字符串内容) String D = "Hello world!";//首先在String常量池中查找是否存在一个这个数据,发现没有,然后在常量池中开辟一个"Hello world!"大小的空间,假设起始地址是:0x2000000,那么D=0x2000000; String E = "Hello world!";//在String常量池中查找是否存在一个这个数据,存在,那么E=0x2000000; String F = new String("Hello world");//首先在堆中分配空间,假设起始地址是:0x1000000,那么F=0x1000000,然后在String常量池中查找是否存在一个这个数据,存在,那么在堆中的这个对象指向常量池中的0x2000000; System.out.println("D==E ————> "+(D == E));//两者相同,true System.out.println("D==F ————> "+(D == F));//两者不同,false(0x2000000和0x1000000不同) 基本数据类型:上面图示中(boolean、byte、char、short、int、float、long、double)8种 对象型数据类型:上面图示中(reference,指的是对象类型,数组类型,字符串类型,可以类比指针理解,是指向型的)
图示
总结
1、上述内容,简单滴介绍了程序的运行状态,学艺不精,总结甚少,期待您的补充…
2、以上是个人学习的一些记录,由于是刚入门不久,难免会出现不严谨,甚至是错误,欢迎读者批评指正。
参考(感谢)
1、http://jingyan.baidu.com/article/4e5b3e1968969891901e24f2.html
2、http://blog.csdn.net/cutesource/article/details/5904501
3、http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml