title: Static内存分析
tags: Java基础知识
abbrlink: 49066
date: 2021-04-25 19:06:41
Static内存分析
一.基础须知
1.静态变量
1)定义:
在一个Java类中,可以使用static关键字来修饰全员变量,该变量被称作静态变量
2)访问形式:
类名 . 变量名
实例名 . 变量名
3) 只能修饰成员变量,不能修饰局部变量
2.静态方法
1)定义:被static关键字修饰的方法被称为静态方法
2)访问形式:
类名 . 静态方法名
实例名 . 静态方法名
3)说明:
非静态方法可以访问静态方法或非静态方法的,静态只能访问静态的
原因: 静态方法或变量随着类的加载而加载,而非静态的方法或变量随着对象的创建而加载。
3.静态代码块
1)再JAVA中,使用一堆大括号包围起来的若干行代码被称为一个代码块
2)使用static关键字修饰的代码块称为静态代码块。
3)当类被加载时,静态代码块会执行,并且只执行一次。
4)在程序中,经常使用静态代码块来对类的成员变量进行初始化
[外链图片转存中…(img-eSxMOjIe-1714480792217)]
4.非静态方法中不能创建 静态变量
原因:静态变量的核心是数据共享,则优先存在于全体,可全体使用,而成员方法里定义的变量是局部变量,局部变量只在这个方法里生效,非静态方法中创建静态变量 与静态变量的数据共享相违背
[外链图片转存中…(img-DjyieMkK-1714480792221)]
5.静态方法不能访问非静态方法
原因:静态方法的核心也为数据共享,而非静态方法则优先存在于全体,可全体使用,非静态方法只有调用才存在生效否则不起作用,与静态方法的优先已知存在于集体相违背
[外链图片转存中…(img-77525XsJ-1714480792222)]
二.静态内存分析
问:你觉得静态变量应该在1.栈内存 2.堆内存 3.方法区 中的哪一个呢?
答:3.方法区
解析:如上图所示static应该在方法区,因为方法区中有共享区来专门存放静态数据,比如静态变量,静态方法,静态代码块。如图所示序号为存在优先级。
深度解析共享数据即: 1.全体可使用的数据
2.在用时随时可用
3.优先整体存在
则在调用中,静态方法不能在非静态方法中所创造,因为非静态方法中的变量不能满足全体可使用,数据共享
则在调用中,非静态成员方法不能调用静态方法,应为静态方法优先存在,非静态成员方法在堆中要由程序员开辟,则存在逻辑问题——一个还未被创造开辟的(或者说优先存在级最低的)方法如何能创造一个已经优先他存在的静态函数