JAVA中static关键字的常见用法
1. 静态变量
变量:
(1)成员变量(全局变量)
独立于方法之外的变量存放在全局内存中,线程共享,静态变量存放在方法区的静态区,实例变量存放在java堆内存中
静态变量(类成员变量)
通过类名访问;随着类的加载和回收创建和释放;先于对象存在;
实例变量
(2)局部变量
在方法中声明的变量,方法内有效存放在java虚拟机栈中,线程私有
2. 静态方法
在类加载的时候创建静态方法必须实现,不能使用abstract(抽象)修饰静态方法内不能直接访问类内的非静态方法和非静态变量,需要声明实例对象访问,无法访问this,super关键字使用类名访问或类的实例对象访问
3. 静态内部类
创建时不需要外部类的实例对象创建,非静态内部类创建时依赖外部类的实例对象
public class Test {
class NestedClass {
}
static class StaticNestedClass {
}
public static void main(String
[] args
) {
Test test
= new Test();
NestedClass NestedClass
= test
.new NestedClass();
StaticNestedClass staticNestedClass
= new StaticNestedClass();
}
}
4. 静态代码块
类加载时执行,且只执行一次
public class Test {
static {
System
.out
.println("静态代码块");
}
public static void main(String
[] args
) {
Test test
= new Test();
}
}
5. 静态导包
静态导入java包或包中某个类静态方法
import static java
.lang
.System
.*
;
import static java
.lang
.Math
.random
;
public class Test {
public static void main(String
[] args
) {
out
.print(".....");
out
.println(random());
}
}
执行顺序
import static java
.lang
.System
.*
;
public class Main {
private static String varible
= "静态变量";
private String varible1
= "非静态变量";
static {
out
.println("静态代码块中访问静态变量......"+varible
);
Main main
= new Main();
out
.println("静态代码块中访问静态变量......"+main
.varible1
);
}
{
out
.println("非静态代码块.....");
}
class NestedClass {
NestedClass(){
out
.println("静态内部类初始化......");
}
}
static class StaticNestedClass {
StaticNestedClass(){
out
.println("非静态内部类初始化......");
}
}
public static void func(){
out
.println("静态方法中访问静态变量....."+varible
);
Main main
= new Main();
out
.println("静态方法中访问非静态变量....."+main
.varible1
);
}
public static void main(String
[] args
) throws CloneNotSupportedException
{
System
.out
.println("hello world");
Main main
= new Main();
NestedClass NestedClass
= main
.new NestedClass();
StaticNestedClass staticNestedClass
= new StaticNestedClass();
out
.println("main中输出静态变量......"+varible
);
out
.println("main中输出非静态变量......"+main
.varible1
);
func();
}
}
静态代码块中访问静态变量
......静态变量
非静态代码块
.....
静态代码块中访问静态变量
......非静态变量
hello world
非静态代码块
.....
静态内部类初始化
......
非静态内部类初始化
......
main中输出静态变量
......静态变量
main中输出非静态变量
......非静态变量
静态方法中访问静态变量
.....静态变量
非静态代码块
.....
静态方法中访问非静态变量
.....非静态变量
首先加载静态变量和静态代码块,静态变量和静态代码块的加载顺序取决于代码的顺序,只执行一次;成员变量和非静态代码块在每次类创建实例对象时执行,执行完成后执行构造函数,可执行多次;类的初始化,首先加载静态类,静态类加载完成后加载非静态类;