您的位置:首页 > 编程语言 > Java开发

Java程序编译&运行笔记

2016-03-26 14:59 288 查看

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、/article/1684698.html

3、http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: