一.静态成员方法
1 .静态成员方法中不能调用非静态方法(相反可以),因为非静态方法是要用对象的引用来访问的,而静态方法是不依赖对象存在的。(比如本来你要调用静态方法,它不需要实例化对象,能够直接调用;但是你在静态方法里面加 了一个非静态方法,而非静态方法必须要实例化对象才能调用,从而引发矛盾)。
2. 静态成员方法不属于对象,该方法的地址存放在方法区中。
二.静态成员变量,局部变量,成员变量
- 静态成员变量只有一份,它不属于对象,存放在方法区内
- 局部变量存放在栈中
- 普通成员变量存放在堆中(普通成员变量表示除了静态成员变量以外的成员变量)
1.如下图所示,count,SIZE3是静态成员变量,不属于对象,存在方法区内;
2.实例化了两个Person对象,他们都存放在堆中,所以像是age,name,SIZE2这些成员变量都是属于对象的,所以它们都存放在堆中;
3.在方法eat()里面的SIZE,a属于局部变量存放在栈中;同时在栈中还存放着两个对象的引用,其中存着Person1和Person2的地址
下面所说的栈,堆,方法区对应JVM中的java虚拟机栈,堆,以及方法区
此外还有要注意的点
- 成员方法内部不能定义静态成员变量,只能访问。因为静态变量是存在方法区里面的,只能被初始化一次。要是成员方法被多次调用,那就岂不是要被多次初始化吗?
- 在Java中,若局部变量没有进行初始化,则不能通过编译,切记。
- 但是,若成员变量没有进行初始化,则创建对象后,会有默认值,可以访问。
三.JVM中相对应的内存划分
- 本地方法栈:用来存储本地方法的变量(什么是本地方法:底层是C/C+ +代码实现的方法,有一个特性:被native所修饰。特点:速度快)
- 堆:用于存放对象,那些new出来的东西就存放在堆上。
- java虚拟机栈:就是我们平时所说的栈。
- 程序计数器:例如存放下一条执行的指令。
- 方法区:就是上面所提到的方法区,用来存放静态成员变量和静态方法地址的一个区域。