Java程序编译&运行笔记

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值