深入解析static关键字 - 极悦
首页 课程 师资 教程 报名

深入解析static关键字

  • 2020-11-18 17:20:34
  • 1287次 极悦

static是java语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。在java语言中凡是用static修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问,即使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关。本文主要来解析一下static关键字的深层原理。

要理解static关键字为什么会有上面的特性,首先我们还需要从jvm内存说起。我们先给出一张java的内存结构图,然后通过案例描述一下static修饰的变量的存放位置。

image.png

从上图我们可以发现,静态变量存放在方法区中,并且是被所有线程所共享的。这里要说一下java堆,java堆存放的就是我们创建的一个个实例变量。

1.堆区

  • 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
  • jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

2.栈区

  • 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  • 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

3.方法区

  • 又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  • 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

下面通过一个案例说明一下,从内存的角度来看,static关键字为什么会有这样的特性。

首先我们定义一个类

public class Person {
//静态变量
static String firstName;
String lastName;
public void showName(){
System.out.println(firstName+lastName);
}
//静态方法
public static void viewName(){
System.out.println(firstName);
}
public static void main(String[] args) {
Person p =new Person();
Person.firstName = "小";
p.lastName="明";
p.showName();
Person p2 =new Person();
Person.firstName="阿";
p2.lastName="丽";
p2.showName();
}
}
//输出。小明、阿丽

接下来我们从内存的角度出发,可以看出我们的方法在调用的时候,是从方法区调用的,但是堆内存不一样,堆内存中的成员变量lastname是随着对象的产生而产生。随着对象的消失而消失。静态变量是所有线程共享的,所以不会消失。这也就能解释上面static关键字的真正原因。

我们在使用使用static关键字时需要注意:

  • 静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
  • 静态方法中不可以使用this或者super关键字。
  • 主函数是静态的

最后,我们看完了本文对static关键字的解析如果还有什么不明白的地方可以观看本站的Java SE教程,里面对static关键字的讲解更加全面透彻,让你从无到有,快速掌握static关键字。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交