目录
1、static存在的主要意义
static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性并调用方法!
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能 。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
2、静态:关键字static的概述
2.1 理解static
static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)
class A {
static {
System.out.println("A : 静态代码块");
}
static int i ; // 静态变量
static void method() {
System.out.println("A: 静态方法");
}
}
简而言之,被static关键字修饰的内容都是静态的。
静态是相对于动态的。
动态是指Java程序在JVM上运行时,JVM会根据程序的需要动态创建对象并存储对象(分配内存) ,对象使命结束后,对象会被垃圾回收器销毁,即内存回收由JVM统一管理并分配给其他新创建的对象;
静态是指Java程序还没有运行时,JVM就会为加载的类分配空间存储被static关键字修饰的内容 ;如静态成员变量,Java类加载到JVM中,JVM会把类以及类的静态成员变量存储在方法区,我们知道方法区是线程共享且很少发生GC的区域,所以被static关键字修饰的内容都是全局共享的,且只会为其分配一次存储空间。
所以当类的某些内容不属于对象,而由对象共享即属于类的时候,就可以考虑是否用static关键字进行修饰。
怎么理解“类的加载在虚拟机运行期间只加载一次”?就是说,类(图纸)是用来创建对象(房子)的,图纸打印一张就够了,房子就可以造无数个。静态指的是打印图纸(加载类)时一起做的事情,比如在图纸(类)上加个批注(赋值静态属性)或者给图纸贴个膜(执行静态代码块),全体的对象(房子)都会使用同样的批注(静态属性);图纸只需要一张膜也只需要贴一次。
其实再往深里讲,类(图纸)也是一个对象,是class类的对象,虚拟机一运行,就先打印了各种各样的图纸(加载了类),但图纸是住不了人的,只有变成房子(类创建了对象)才能住人(操作对象的方法和属性)。
2.2 概念小结
static表示“静态”的意思,可以用来修饰成员变量和成员方法(后续还会学习 静态代码块 和 静态内部类)。
static的主要作用在于创建独立于具体对象的域变量或者方法
简单理解:
- 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访 问;
- 并且不会因为对象的多次创建 ,而在内存中建立多份数据;
2.3 重点
静态成员 在类加载时加载并初始化。