深入分析Java中的关键字static
摘自:https://baijiahao.baidu.com/s?id=1636927461989417537&wfr=spider&for=pc
static 代表是静态的
修饰类内的类、方法、成员变量
修饰的类中类,可以用类名直接调用如:StaticTest.InnerClass()
其他的方法只能通过实例化的对象调用,如:
StaticTest obj = new StaticTest();
obj.InnerMethod()
修饰的方法如主函数main
修饰的成员变量,这个变量就属于类了,不属于变量,即使实例化了对象obj1,只要给赋值,
那其他实例化的对象的这个变量的值也会改变,对象obj2.变量再给赋值,obj1.变量也会改变。
这个变量相当于全局的变量。
StaticTest obj1 = new StaticTest();
obj1.变量=1
StaticTest obj2 = new StaticTest();
obj2.变量也就成了1,如果obj2.变量再给赋值,
如obj2.变量=2,obj1.变量也就成了2

内部的原理:

从上图我们可以发现,静态变量存放在方法区中,并且是被所有线程所共享的。这里要说一下java堆,java堆存放的就是我们创建的一个个实例变量。
堆区:
1、存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2、jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2、每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。、
方法区:
1、又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2、方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
下面通过一个案例说明一下,从内存的角度来看,static关键字为什么会有这样的特性。

下面对static关键字进行一个小结:
(1)特点:
1、static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。
2、static修饰的成员被所有的对象共享。
3、static优先于对象存在,因为static的成员随着类的加载就已经存在。
4、static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。
5、static修饰的数据是共享数据,对象中的存储的是特有的数据。
(2)成员变量和静态变量的区别:
1、生命周期的不同:
成员变量随着对象的创建而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失。
2、调用方式不同:
成员变量只能被对象调用。
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
3、别名不同:
成员变量也称为实例变量。
静态变量称为类变量。
4、数据存储位置不同:
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
(3)静态使用时需要注意的事项:
1、静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
2、静态方法中不可以使用this或者super关键字。
3、主函数是静态的

浙公网安备 33010602011771号