Static内存分析

一.基础须知

1.静态变量

1)定义:

在一个Java类中,可以使用static关键字来修饰全员变量,该变量被称作静态变量

2)访问形式:

​ 类名 . 变量名

​ 实例名 . 变量名

3) 只能修饰成员变量,不能修饰局部变量

2.静态方法

1)定义:被static关键字修饰的方法被称为静态方法

2)访问形式:

​ 类名 . 静态方法名

​ 实例名 . 静态方法名

3)说明:

非静态方法可以访问静态方法或非静态方法的,静态只能访问静态的

​ 原因: 静态方法或变量随着类的加载而加载,而非静态的方法或变量随着对象的创建而加载。

3.静态代码块

1)再JAVA中,使用一堆大括号包围起来的若干行代码被称为一个代码块

2)使用static关键字修饰的代码块称为静态代码块。

3)当类被加载时,静态代码块会执行,并且只执行一次。

4)在程序中,经常使用静态代码块来对类的成员变量进行初始化

image.png

4.非静态方法中不能创建 静态变量

原因:静态变量的核心是数据共享,则优先存在于全体,可全体使用,而成员方法里定义的变量是局部变量,局部变量只在这个方法里生效,非静态方法中创建静态变量 与静态变量的数据共享相违背

image.png

5.静态方法不能访问非静态方法

原因:静态方法的核心也为数据共享,而非静态方法则优先存在于全体,可全体使用,非静态方法只有调用才存在生效否则不起作用与静态方法的优先已知存在于集体相违背

image.png

二.静态内存分析

image.png

:你觉得静态变量应该在1.栈内存 2.堆内存 3.方法区 中的哪一个呢?

:3.方法区

image.png

解析:如上图所示static应该在方法区,因为方法区中有共享区来专门存放静态数据,比如静态变量,静态方法,静态代码块。如图所示序号为存在优先级


深度解析共享数据即: 1.全体可使用的数据

2.在用时随时可用

3.优先整体存在


则在调用中,静态方法不能在非静态方法中所创造,因为非静态方法中的变量不能满足全体可使用,数据共享

则在调用中,非静态成员方法不能调用静态方法,应为静态方法优先存在,非静态成员方法在堆中要由程序员开辟,则存在逻辑问题——一个还未被创造开辟的(或者说优先存在级最低的)方法如何能创造一个已经优先他存在的静态函数