方法区(Method Area)存储的静态变量[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。
1:方法区(Method Area)存储的静态变量
静态变量又称为类变量,类中被static修饰的成员变量都是静态变量(类变量)
静态变量之所以又称为类变量,是因为静态变量和类关联在一起,随着类的加载而存在于方法区(而不是堆中)
八种基本数据类型(byte、short、int、long、float、double、char、boolean)的静态变量会在方法区开辟空间,并将对应的值存储在方法方法区,对于引用类型的静态变量如果未用new关键字为引用类型的静态变量分配对象(如:static Object obj;)那么对象的引用obj会存储在方法区中,并为其指定默认值null;若,对于引用类型的静态变量如果用new关键字为引用类型的静态变量分配对象(如:static Person person = new Person();),那么对象的引用person 会存储在方法区中,并且该对象在堆中的地址也会存储在方法区中(注意此时静态变量只存储了对象的堆地址,而对象本身仍在堆内存中);
这个过程还涉及到静态变量初始化问题:
2:构造代码块与静态代码块(静态初始化块)
1.构造代码块:每次创建对象时执行 2.静态代码块(静态初始化块):JVM加载类(加载在运行之前)时执行,静态代码块(静态初始化块)只执行一次
为啥需要静态初始化块?
静态初始化块主要用来初始化类变量
类变量可以在构造函数中初始化为啥还要定义静态初始化块呢?
因为,类变量可以通过类名.类变量的形式调用,有的时候我们不想为了初始化类变量而创建对象,所以就有了静态初始化块。 静态初始化块可以在类加载的时候执行一次。避免了了初始化类变量而创建对象
public static B t1 = new B();是类变量及引用(静态变量及静态引用)的初始化
执行顺序:类变量及引用(静态变量及静态引用)的初始化(默认初始化或“=”显示赋值)->静态代码块(静态初始化块,堆默认初始化的类变量根据需要重新初始化)->main()->实例变量及引用的初始化->构造代码块->构造方法 例:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
输出如下: 构造块 构造块 静态块 构造块 原因 类变量及引用(静态变量及静态引用)的初始化(默认初始化或“=”显示赋值)优先于静态初始化块(静态块)执行,接下来静态初始化块(静态块)按照申明顺序执行,, 首先,执行public staticB t1 = newB();该语句创建对象,则会调用构造代码块,输出第一个构造块
其次,执行public static B t2 = new B();该语句又创建新对象,则又会调用构造代码块,输出第二个构造块
接着,再按照静态代码块申明顺序执行下面的静态代码块:输出静态块
static
{
System.out.println("静态块");
}
最后,main方法执行,创建对象,输出构造块
。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144883.html原文链接:https://javaforall.cn
相关文章
- PHP面向对象之魔术方法__call应用场景(基础)
- 【说站】php安装扩展的几种方法
- 静态路由汇总的方法
- html复选框选中与未选中触发事件的方法
- 如何在 Python 中创建静态类数据和静态类方法?
- 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
- 【Groovy】Groovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )
- centOS7 桥接模式设置静态Ip的方法步骤
- redis 存储对象的方法对比分析
- MySQL中SQL语句的使用方法(mysql中sql语句)
- ip设置Linux服务器静态IP的方法(linux静态)
- Linux指定静态IP地址配置方法(linux指定ip)
- Mysql查看表格属性的方法(mysql查看属性)
- win2008 Iis7伪静态配置方法
- IIS6中.net项目伪静态重写路径的配置方法
- Linux下删除消息队列方法(删除消息队列linux)
- 探究Linux的强大之处:现代化图形界面的实现方法(linux的图形界面)
- win2008 Iis7伪静态配置方法
- 三种禁用FileSystemObject组件的方法
- asp的程序能实现伪静态化的方法
- ASP.NETURL伪静态重写实现方法
- IIS访问网站的用户过多解决方法
- php运行出现Calltoundefinedfunctioncurl_init()的解决方法
- asp简单生成静态的方法(模板标签替换)
- apache中访问不了伪静态页面的解决方法
- redis数据库查找key在内存中的位置的方法
- windows2008R264位服务器中开启phpcurl扩展的方法
- python错误:AttributeError:'module'objecthasnoattribute'setdefaultencoding'问题的解决方法