一个java程序的编译与在内存中形式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34819586/article/details/78377984

转载请注明出处:http://blog.csdn.net/qq_34819586

                             一个java程序的编译与在内存中形式

1:Java程序入口点:一个java程序可以有很多个类,但是程序入口点就只有一个,就是可执行类。(可执行类要带有main方法。)

2:程序运行起来后是以进程的形式存在于内存中:

1  每个进程都申请了个内存空间。

进程申请的个内存空间分为栈和堆,每个(stack)线程对应一个栈(即每个线程只拥有一个栈,栈是后进先出,线程很小,多数下只有64k),一个进程只拥有一个(heap)堆(很大,甚至可以使用虚拟内存就是把硬盘空间拿来当内存用)。

2   进程的工作是由一个到多个线程构成,进程是一个逻辑概率(我认为可以认为进程是不存在的,进程只是用来向系统申请内存时用到,因为进程是系统进行资源分配和调度的基本单位),真正执行任务的是线程,进程依靠线程来推动自身的工作。(任务管理器中可以看到你电脑有几个进程几个线程几个句柄。其实句柄就是指针,指向于某个资源。)

3   如果你的java程序没有创建线程,那么程序就是单进程单线程的程序,这个线程叫做main线程是jvm帮忙创建的。

3:java程序是如何被编译器解析的:

1   程序是被从左向右解析的,你在开发时每写的一个东西虚拟机就会帮你在这个开发环境里找你写的东西,没有就会报错。

2   虚拟机每解析到一个类就会把类加载到堆内存中(堆内存中有个专门放代码的地方叫做code area代码区,代码区会存放类的属性与方法)。

如下面解析到大Car时编译器会先搜索你的开发环境有没Car类没会报错,有就会把类加载到堆中代码区。

3   下面举个例子Car car=new Car();是如何被解析的。

  其中小car 在java中叫做引用变量(其实就是指针),这个引用变量被创建在栈空间,(引用变量大小占32位或64位 ),引用变量用来指向对象。

 New 创建了一个对象(这个对象在堆内存中),对象体内只有属性没有方法,(属性分为显示和隐示属性,显示属性就是类中属性,隐示就是this,super不用创建就有的。)

因为类的所有方法在代码区中为所有的对象共享 ,对象用方法代码指针来指向代码区中类的方法(这个方法代码指针也是编译器帮你搞好的)。

小知识点:对象还有个别名叫实例。类其实就是由结构题演化过来的。

3   =等于就是 把对象在堆中的地址赋给了car。

(程序员是只能操作栈中变量来对,对象进行赋值与调用的。)

额外知识点:

1   new Car();执行后其实创建的是一个(naked object)裸对象(就是所有属性都是默认值或空白),接着编译器会调用构造方法对属性赋值。(构造方法要与类同名,构造方法不能有返回值void也不行)     

所以new Car +Car()=new Car();实际中不能这么写,这只是想说明对象创建是经历过创建和赋值这两个步骤的。

2   静态方法和属性:可以不用实例化对象就调用。因为堆中有个区域专门放静态属性和方法的,你可以直接用类名.静态属性或静态方法来调用静态属性和方法。

静态方法中只能调用静态方法或属性以及对象。

 

猜你喜欢

转载自blog.csdn.net/qq_34819586/article/details/78377984
今日推荐