JAVA随堂笔记课【三】:面向对象

概述

之前已经说过类是超级结构体。
接下来会从整个操作系统讲起,描述类在内存空间中最基本的创建和调用过程。其他情况之后再讲。

进程和线程在内存中的分布

计算机由操作系统(OS)管理所有的软硬件资源。每个程序在OS中运行时,在OS中体现为一个进程(Proc.)。一个OS同时执行了很多Proc。
如图:
JAVA随堂笔记课【三】:面向对象_第1张图片

但是,Proc只是一个逻辑单位,真正干活的是线程(thread)
每一个进程至少要包含一个线程,进程的执行是靠线程来推动的。
现阶段是JAVA初阶,所编写的都是单Proc单thread程序。每个进程都包含唯一的一个线程。

操作系统以进程为单位给程序分配资源,特别是内存资源。
进程得到了内存之后,以堆和栈的方式来使用。
我们给每个线程分配一个栈(stack,很小,只有64KB)。
进程得到分配给自己的线程之后,剩余的空间用堆(heap)的方式来管理。

注:堆的大小常常可以突破内存限制。多出来的部分放在硬盘里,由硬盘暂时替代内存的作用。这一段硬盘空间叫做虚拟内存

代码 Car c = new Car(); 在内存中的布局方式

假设有一个Car类,代码如下:

class Car{
    String brand;
    int price;

    void run();
}

这段代码会被放在堆(Heap)中的代码区。同理,其他的类也会放在代码区,等待对象们对其进行调用

然后在main()中给出这样一段代码:

Car c = new Car();

这段代码可以分为4部分理解。
1. car (类代码加载)
2. c (构建一个引用变量c)
3. new Car (构建一个Car对象)
4. Car(); (构建出来的Car对象执行一次构造函数)

接下来我们会一步一步的描述这段代码在内存空间中对应的全部细节。
第1步,类代码加载。系统会从代码区中获取到Car类的代码,并用它加载。
然后,第2步,构建一个引用变量c,把他放到主线程(main thread)的栈(stack)中。这样以后当该引用变量执行函数——比如run时,会传递一个信息——c.run();到相关对象。
但是!现在我们还没有构建对象。所以第3步,在内存空间中构建一个car对象出来
最后就简单了,第4步,构建出来的Car对象执行一次构造函数

整个布局方式如图所示:
JAVA随堂笔记课【三】:面向对象_第2张图片

你可能感兴趣的:(JAVA随堂笔记课【三】:面向对象)