目录
static简介
static变量
static方法
static代码块
static简介
Java static关键字主要用于内存管理,static关键字可以声明静态变量,静态方法和静态代码块,它们都属于类,不属于类的实例对象。
static可以用于:
- 变量
- 方法
- 代码块
static变量
static关键字声明的变量称为static变量(静态变量),其他类可以直接通过类名.变量名访问。
- static可以用来声明类和对象都能够访问的变量,比如说员工的公司名称,学生的学校名称
- 静态变量在类加载时就会存放在内存
普通变量和静态变量的区别
public class staticandnornal {
public String normalVar = "非静态变量";
public static String staticVar = "静态变量"; // 声明变量前加上static关键字,称之为静态变量
}
class staticTest{
public static void main(String[] args) {
staticandnornal s = new staticandnornal(); // 实例化对象
System.out.println(s.normalVar); // 通过类的实例访问非静态变量
System.out.println(s.staticVar); // 通过类的实例访问静态变量,但是不建议
System.out.println(staticandnornal.staticVar); // 建议通过类名.变量名访问静态变量
// 静态变量可以重新赋值,如果想要静态变量保持不变,可以在static关键字前面加上final
System.out.println(staticandnornal.staticVar = "修改后的静态变量");
}
}
static方法
static关键字声明的方法称为static方法(静态方法),注意以下几点
- 静态方法只能使用静态变量和调用其他的静态方法,不能调用非静态方法和非静态变量。
- 非静态方法可以调用静态方法和静态变量
- 其他类可以通过类名.方法名直接调用静态方法
- super和this关键字不能在静态上下文使用
public class staticandnornal {
public String normalVar = "非静态变量";
public static String staticVar = "静态变量"; // 声明变量前有static关键字,称之为静态变量
// 非静态方法可以调用非静态变量和方法,也可以调用静态方法和变量
void printNormalVar() {
System.out.println("printNormalVar:" + normalVar);
System.out.println("printNormalVar:" + staticVar);
staticMethod1();
}
// 静态方法只能调用静态变量和静态方法
static void staticMethod() {
// System.out.println(normalVar); 代码报错提示:无法从静态上下文中引用非静态变量 normalVar
// printNormalVar(); 代码报错提示:错误: 无法从静态上下文中引用非静态方法 printNormalVar()
System.out.println("staticMethod:" + staticVar);
staticMethod1();
}
static void staticMethod1() {
System.out.println("静态方法:staticMethod1");
}
}
class staticTest{
public static void main(String[] args) {
staticandnornal s = new staticandnornal(); // 实例化对象
s.printNormalVar(); // 类的实例化对象访问非静态方法
// s.staticMethod(); 类的实例化对象访问静态方法,不建议使用
staticandnornal.staticMethod(); // 建议通过类名.静态方法名使用
}
}
static代码块
static代码块也叫静态代码,有以下几种特性
- static代码块用于类的初始化操作,加载类的时候JVM会按照类的执行顺序依次执行静态代码块且只会执行一次
- static代码块只能调用静态方法和静态变量
- 不在任何方法体内,是独立于类成员的代码块
public class staticandnornal {
public String normalVar = "非静态变量";
public static String staticVar = "静态变量"; // 声明变量前有static关键字,称之为静态变量
// 非静态方法可以调用非静态变量和方法,也可以调用静态方法和变量
void printNormalVar() {
System.out.println("printNormalVar:" + normalVar);
System.out.println("printNormalVar:" + staticVar);
staticMethod1();
}
// 静态方法只能调用静态变量和静态方法
static void staticMethod() {
// System.out.println(normalVar); 代码报错提示:无法从静态上下文中引用非静态变量 normalVar
// printNormalVar(); 代码报错提示:错误: 无法从静态上下文中引用非静态方法 printNormalVar()
System.out.println("staticMethod:" + staticVar);
staticMethod1();
}
static void staticMethod1() {
System.out.println("静态方法:staticMethod1");
}
static {
System.out.println("Static代码块");
// static代码块不能使用非静态成员
//System.out.println(normalVar);
//printNormalVar();
// static代码块可以使用静态成员
System.out.println(staticVar);
staticMethod();
}
public static void main(String[] args) {
}
}
输出结果:
Static代码块
静态变量
staticMethod:静态变量
静态方法:staticMethod1
main方法中没有任何方法和对象的调用,代码仍有输出,说明static代码块在类加载的过程中执行的,不需要任何调用。