java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存??相关的知识,希望对你有一定的参考价值。

全局变量是在创建对象的时候分配内存的 创建对象过程为 

    分配空间。

    递归的创建父类对象。

    初始化成员变量。

    调用构造方法创建一个对象。

静态变量是在类加载的时候分配空间的,静态变量和对象没有关系 是在JVM第一次读到一个类的时候加载信息的过程中分配空间的 加载过程为

1 .加载父类(如果父类已经加载过,则不在加载)。

2.初始化静态属性 。

3 .按顺序的初始化静态代码块   初始化的前提就是分配空间 。

而且静态变量在以后的创建对象的时候不在初始化 所以一般用静态来保存共享信息

    静态变量存在于方法区中,成员变量存在于堆内存中,成员变量所属于对象JAVA成员变量和静态变量的区别,成员变量随着对象创建而存在。随着对象被回收而消失。静态变量随着类的加载而存在。

    静态变量是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。

    对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。

    而在以Pascal为代表的许多程序语言中,所有局部变量都由系统自动分配存储空间,而所有全局变量的存储空间则以静态分配的方式获取,因此由于实际上“局部变量”和“全局变量”这两个术语已足以涵盖所有的情况,在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。

    在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在编译后的代码里二者也以相同的方式获取存储空间。而今术语“静态变量”的概念则主要基于C族语言的“static”的定义。

    静态变量也可以用于存储常数。具体来说,静态变量可用const,constant或final等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区。

参考技术A 关于这个问题,全局变量(成员变量)是在创建对象的时候分配内存的创建对象过程为1分配空间2递归的创建父类对象(无父类这步可省略)3初始化成员变量4调用构造方法创建一个对象
静态变量是在类加载的时候分配空间的,静态变量和对象没有关系是在JVM第一次读到一个类的时候加载信息的过程中分配空间的类加载过程为1加载父类(如果父类已经加载过,则不在加载)2初始化静态属性3按顺序的初始化静态代码块
初始化的前提就是分配空间
而且静态变量在以后的创建对象的时候不在初始化所以一般用静态来保存共享信息
希望对你有所帮助
参考技术B 用static修饰的变量是在编译的时候分配内存,没有用static修饰的变量是在加载时分配

1-认识c指针

1.指针和内存

c程序在编译后,会以三种形式使用内存

1静态/全局内存

静态声明的变量分配在这里,全局变量也使用这部分内存。这些变量在程序开始运行时分配,直到程序终止时才会消失

2.自动内存

这些变量在函数内部声明,并且在函数调用时才被创建。他们的作用域局限于函数内部,而且生命周期限制在函数的执行时间内。

3.动态内存

内存分配在堆上,可以根据需要释放,而且直到释放才会消失。指针引用分配的内存,作用域限与引用内存的指针。

如何阅读指针说明

 

1 const int *ptr;
2 #代码解读
3 1.ptr 是有个变量
4 2.ptr 是一个指针变量
5 3.ptr是一个指向整型的指针变量
6 4.ptr是一个指向常数常亮的指针变量

 

注意:指针变量所对应的是地址,而整型变量存放的是某个地址上数据

用间接引用操作符(*)接引指针

 

1 int num = 5;
2 int *ptr = #
3 printf("%d
",*ptr);
4 #指针的接引 *ptr

 

我们也可以把接引操作符的结果用作左值。术语左值是指赋值操作符左边的操作数,所有左值都必须可以修改,因为他们会被赋值。

null的概念

任何时候都不能对NULL指针进行接引,因为它并不包含合法地址

0的含义可能随着代码的不同而含义不同

 

1 int num  = 9; 
2 int *ptr = 0;#此时的0为NULL
3 *ptr - 0;#此时的0为常数0

 

指针操作符

*                   用来声明指针

*                   用来解引指针

->                 指向指针

+                  用于指针做加法

-                   用于指针做减法

==  !=          比较两个指针

> < >= <=    比较两个指针

 

 1 int vector = {1,2,3}
 2 int * ptr = vector;
 3 printf("%d
",*ptr);
 4 #输出的值为1
 5 ptr  += 1;
 6 printf("%d
",*ptr);
 7 ptr  += 1;
 8 printf("%d
",*ptr);
 9 #输出的值为1
10 ptr  += 1;
11 #输出的值为1

 

每次的指针加一,地址就加4

指针做减法

 

1 int vector = {28,41,7};
2 int *ptr = vectoe + 2;
3 printf("%d
",*ptr);
4 #打印出的值是7;
5 ptr --;
6 printf("%d
",*ptr);
7 #打印出的值是41;

 

ptr的每次减一,地址都会向前移动四个字节

指针相减

两个指针相减会的到两个指针的地址上的差值,可以判断数组中的元素顺序。

 

以上是关于java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存??的主要内容,如果未能解决你的问题,请参考以下文章

总结了一些指针易出错的常见问题

1-认识c指针

1-认识c指针

全局变量和局部变量

C++类中的静态成员函数以及静态成员变量

C++类中的静态成员函数以及静态成员变量