static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量、方法、做静态代码块、静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始,从基本用法入手,然后分析其原理、优化等。
初识 static 关键字 static 修饰变量static 关键字表示的概念是 全局的、静态的,用它修饰的变量被称为静态变量。
public class TestStatic { static int i = 10; // 定义了一个静态变量 i }静态变量也被称为类变量,静态变量是属于这个类所有的。什么意思呢?这其实就是说,static 关键字只能定义在类的 {} 中,而不能定义在任何方法中。
就算把方法中的 static 关键字去掉也是一样的。
static 属于类所有,由类来直接调用 static 修饰的变量,它不需要手动实例化类进行调用
public class TestStatic { static int i = 10; public static void main(String[] args) { System.out.println(TestStatic.i); } }这里你需要理解几个变量的概念
定义在构造方法、代码块、方法外的变量被称为实例变量,实例变量的副本数量和实例的数量一样。
定义在方法、构造方法、代码块内的变量被称为局部变量;
定义在方法参数中的变量被称为参数。
详情参考
static 修饰方法static 可以修饰方法,被 static 修饰的方法被称为静态方法,其实就是在一个方法定义中加上 static 关键字进行修饰,例如下面这样
static void sayHello(){}《Java 编程思想》在 P86 页有一句经典的描述
static 方法就是没有 this 的方法,在 static 内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法,这实际上是 static 方法的主要用途。
其中有一句非常重要的话就是 static 方法就是没有 this 的方法,也就是说,可以在不用创建对象的前提下就能够访问 static 方法,如何做到呢?看下面一段代码
在上面的例子中,由于 staticMethod 是静态方法,所以能够使用 类名.变量名进行调用。
因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为 static。平常我们见的最多的 static 方法就是 main方 法,至于为什么 main 方法必须是 static 的,现在应该很清楚了。因为程序在执行 main 方法的时候没有创建任何对象,因此只有通过类名来访问。
static 修饰方法的注意事项
首先第一点就是最常用的,不用创建对象,直接类名.变量名 即可访问;
static 修饰的方法内部不能调用非静态方法;
非静态方法内部可以调用 static 静态方法。
static 修饰代码块static 关键字可以用来修饰代码块,代码块分为两种,一种是使用 {} 代码块;一种是 static {} 静态代码块。static 修饰的代码块被称为静态代码块。静态代码块可以置于类中的任何地方,类中可以有多个 static 块,在类初次被加载的时候,会按照 static 代码块的顺序来执行,每个 static 修饰的代码块只能执行一次。我们会面会说一下代码块的加载顺序。下面是静态代码块的例子
static 代码块可以用来优化程序执行顺序,是因为它的特性:只会在类加载的时候执行一次。
static 用作静态内部类内部类的使用场景比较少,但是内部类还有具有一些比较有用的。在了解静态内部类前,我们先看一下内部类的分类
普通内部类
局部内部类
静态内部类
匿名内部类
静态内部类就是用 static 修饰的内部类,静态内部类可以包含静态成员,也可以包含非静态成员,但是在非静态内部类中不可以声明静态成员。