Java有关成员变量,局部变量,静态成员变量,静态成员方法之间的一些注意点以及他们在JVM内存划分中的情况

一.静态成员方法

1  .静态成员方法中不能调用非静态方法(相反可以),因为非静态方法是要用对象的引用来访问的,而静态方法是不依赖对象存在的。(比如本来你要调用静态方法,它不需要实例化对象,能够直接调用;但是你在静态方法里面加 了一个非静态方法,而非静态方法必须要实例化对象才能调用,从而引发矛盾)。

2.  静态成员方法不属于对象,该方法的地址存放在方法区中。


二.静态成员变量,局部变量,成员变量

  • 静态成员变量只有一份,它不属于对象,存放在方法区
  • 局部变量存放在
  • 普通成员变量存放在中(普通成员变量表示除了静态成员变量以外的成员变量)

1.如下图所示,count,SIZE3是静态成员变量,不属于对象,存在方法区内;

2.实例化了两个Person对象,他们都存放在堆中,所以像是age,name,SIZE2这些成员变量都是属于对象的,所以它们都存放在堆中;

3.在方法eat()里面的SIZE,a属于局部变量存放在栈中;同时在栈中还存放着两个对象的引用,其中存着Person1和Person2的地址

 

 下面所说的栈,堆,方法区对应JVM中的java虚拟机栈,堆,以及方法区

 此外还有要注意的点

  • 成员方法内部不能定义静态成员变量,只能访问。因为静态变量是存在方法区里面的,只能被初始化一次。要是成员方法被多次调用,那就岂不是要被多次初始化吗?
  • 在Java中,若局部变量没有进行初始化,则不能通过编译,切记。

  • 但是,若成员变量没有进行初始化,则创建对象后,会有默认值,可以访问。


 三.JVM中相对应的内存划分

  1. 本地方法栈:用来存储本地方法的变量(什么是本地方法:底层是C/C+ +代码实现的方法,有一个特性:被native所修饰。特点:速度快)
  2. :用于存放对象,那些new出来的东西就存放在堆上。
  3. java虚拟机栈:就是我们平时所说的
  4. 程序计数器:例如存放下一条执行的指令。
  5. 方法区:就是上面所提到的方法区,用来存放静态成员变量和静态方法地址的一个区域。

猜你喜欢

转载自blog.csdn.net/qq_24016309/article/details/120894557