之前几节我们一直在说statickeyword所修饰的静态,那么在程序执行时,内存中static是怎样体现的呢?这一节我们就来看一看。

我们还是先看一个样例。希望我们通过对这个样例的分析让我们刚開始学习的人们对static所修饰的静态在内存中的详细体现有一个深刻的理解。

class Person
{
String name;//姓名。这是一个成员变量
int age;
static String country = "美国";//国籍。这是一个静态变量 Person(String name,int age)//构造函数
{
this.name = name;
this.age = age;
}
public void printInfo()//非静态函数
{
System.out.println(name+":"+age);
}
public static void printCoun()//静态函数,打印静态变量country
{
System.out.println(Person.country);
}
} class StaticTest
{
public static void main(String[] args)
{
Person.printCoun();
Person p = new Person("科比",37);
p.printInfo();
}
}

我们先来看执行结果,然后再一步步分析:

样例非常easy,结果也非常明显,我们之前在7.9中谈成员变量与静态变量的差别时提到了一个差别就是成员变量是存储在堆内存中的对象中。而静态变量则存储在方法区中的静态区中。

这里,我们就引入了内存的一个新区域,那就是方法区。对于方法。当程序执行时。都会被存储在这个区域。

那么我们就对上面的代码执行过程和内存变化进行分析,当然在我们分析之前。我们必须明白一个常识。那就是当我们执行类时,类就会进入内存。


那么对于上面的代码,分析过程就会非常清晰了:

1.当我们执行程序时。StaticTest类进入内存,虚拟机会在方法区的非静态区中分配空间存储StaticTest(){}默认构造函数,同一时候在方法区的静态中分配空间存储static main(){……}主函数,当然包含主函数的全部代码的字节码。

2.静态区的main函数进栈内存,main方法中有一个对象变量p。

3.执行Person.printCoun(){}方法,Person类进入内存。方法区的非表态区分配空间存放构造函数Person(name,age){……}和非静态函数void printInfo(){……},在方法区的静态区中分配空间存储静态变量country="美国"和静态方法printCoun(){……}。

4.静态区的printCoun()方法进栈内存,并从静态区找到静态变量country并打印。控制台输出:“美国”。

5.printCoun()方法执行结束,跳出方法。printCoun()方法出栈内存。

6.执行Person p = new Person("科比",37),此时堆内存中创建空间存储对象,这里如果地址为0x0056,则所属this=0x0056,并有成员变量name和age。

7.非静态区的构造函数Person(name,age)进栈内存,对对象进行初始化,为堆内存中的对象进行初始化,name=科比,age=37。

8.初始化完毕,把地址0x0056赋值给对象p。p=0x0056。

9.构造函数出栈内存,释放參数name和age。

10.执行p.printInfo()语句,非表态区的printInfo()方法进栈内存,this=0x0056。

11.打印this所指向的成员变量this.name和this.age。控制台输出:科比:37。

12.printInfo()方法执行结束,跳出方法,方法出栈内存。

13.main()函数执行结束。跳出,函数出栈内存。

14.程序执行结束。

上面我们对样例中的代码进行了逐步分析。基本上明晰了statickeyword所修饰的静态在程序执行时在内存中的详细变化,希望在以后的实际开发过程中有所帮助。

最后我们再说一个小知识点:存储在方法区中的变量和方法都会对象所共享,所以方法区又称为共享区。


[javase学习笔记]-8.6 静态的内存载入的更多相关文章

  1. [javase学习笔记]-8.7 静态代码块

    这一节我们看一个比較特殊的概念,那就是静态代码块. 前面我们也提到过代码块,就是一段独立的代码空间.那么什么是静态代码块呢?说白了,就是用statickeyword修饰的代码块. 我们来看一个样例: ...

  2. [javase学习笔记]-6.3 对象的内存体现

    这一节我们来简单的看一看对象在内存中是什么样子呢,怎样体现. 我们以上一节的測试代码为例. 我们在函数的内存分配分析过.当该代码执行时,首先会载入主函数在栈内存中为main函数分配一个空间: 然后执行 ...

  3. JavaSE学习笔记(13)---线程池、Lambda表达式

    JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...

  4. JavaSE学习笔记(8)---常用类

    JavaSE学习笔记(8)---常用类 1.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类 ...

  5. JavaSE学习笔记(7)---数组

    JavaSE学习笔记(7)---数组 1.什么是数组 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个 ...

  6. JavaSE学习笔记(2)---面向对象基础

    JavaSE学习笔记(2)---面向对象基础 1.面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能.所以面向对象 ...

  7. JavaSE学习笔记(1)---数据类型、运算符、控制结构

    javaSE学习笔记(1) 数据类型和运算符 1.注释可以提高程序的可读性.可划分为 单行注释 // 多行注释 /.../ 文档注释 /**...*/ 2.标识符的命名规则: 标识符必须以字母.下划线 ...

  8. javaSE学习笔记(17)---锁

    javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...

  9. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

随机推荐

  1. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

  2. Spring学习笔记五:Spring进行事务管理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776256.html  事务管理主要负责对持久化方法进行统一的提交或回滚,Spring进行事务管理即我们无需在 ...

  3. JQuery EasyUI学习笔记

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6690888.html  简介与准备 jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用 ...

  4. ScrollView嵌套EditText联带滑动的解决的方法

    本篇文章的相关内容需结合上文:从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决的方法 在说完了怎样解决ScrollView嵌套E ...

  5. oracle批量更新之使用游标进行分批次更新的5种方式及速度比对

      1.情景展示 一共有22w条数据, 需要将A表的主键更新至B表的指定字段,如何快速完成更新? 2.解决方案 声明: 解决方案不只一种,该文章只介绍快速游标法及代码实现: 两张表的ID和ID_CAR ...

  6. HDU 4472 Count(数学 递归)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472 Problem Description Prof. Tigris is the head of ...

  7. Qt Installer Framework 使用说明(三)

    目录 6.Qt Installer Framework 示例 7.参考 Reference 配置文件 Configuration File 配置文件元素的简要说明 Summary of Configu ...

  8. TCP/IP协议——TCP/IP协议栈及框架

    TCP/IP协议同ISO/OSI模型一样,也可以安排成栈形式.但这个栈不同于ISO/OSI版本,比ISO/OSI栈少,所以又称之为短栈.另外,需要知道的是:TCP/IP协议栈只是许多支持ISO/OSI ...

  9. HDU - 4198 Quick out of the Harbour (BFS+优先队列)

    Description Captain Clearbeard decided to go to the harbour for a few days so his crew could inspect ...

  10. ios中自定义checkbox

    //自定义button#import <UIKit/UIKit.h> @interface CKButton : UIButton @end #import "CKButton. ...