static关键字主要有以下四种使用场景:
1、修饰成员变量和成员方法
2、静态代码块
3、修饰类(只能修饰内部类)
4、静态导包(用来导入类中的静态资源,1.5之后的新特性)
修饰成员变量和成员方法(最常用)
被static修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用
调用格式:
类名.静态变量名
类名.静态方法名()
用public修饰的static成员变量和成员方法可以理解为全局变量和全局方法,当声明它为类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量只能在本类中使用,但是不能在其他类中通过类名来直接引用
静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法,因为this和super是随着构造方法而出现,而静态优先于构造出现,所以静态只能访问静态,不能访问非静态,但是非静态可以访问静态。
一般在需要实现以下两个功能时推荐用static修饰:
1.表征类的属性或者被类中所有对象共享
2.方便资源调用
静态代码块:
1.静态代码块定义在类中方法外
2.静态代码块的格式是
static {
语句体;
}
3.它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行
4.该类不管创建多少对象,静态代码块只执行一次
一个类中的静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果静态代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问
静态内部类:
普通类是不允许声明为静态的,只有内部类才可以被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类
public class Outter {
static class Inner {
public void show() {
System.out.println("这是一个静态内部类");
}
}
public static void main(String[] args) {
Inner i = new Inner();
i.show();
/**
* 如果是普通内部类,则创建对象的格式为:
* 外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
*/
}
}
静态导包:
格式为:import static
这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法
/**
* Math.* --- 将Math中的所有静态资源导入,这时候可以直接使用里面的静态方法,而不用通过类名进行调用
* 如果只想导入单一某个静态方法,只需要将*换成对应的方法名即可
*/
import static java.lang.Math.*;
/**
* 换成import static java.lang.Math.max;具有一样的效果
*/
public class Demo {
public static void main(String[] args) {
int max = max(1,2);
System.out.println(max);
}
}
以上用法使用场景较少,平时开发过程中一般不用