一、static关键字的作用
static关键字在Java中用于定义类的静态成员,包括静态变量和静态方法。
静态成员属于类,而不是类的实例。这意味着不需要创建类的实例就可以访问静态成员。
demo:
public class Sample {
// 静态变量
public static int count = 0;
// 构造函数,每次创建实例时count增加
public Sample() {
count++;
}
// 静态方法
public static void showCount() {
System.out.println("当前实例数量:" + count);
}
public static void main(String[] args) {
// 不需要创建实例即可调用静态方法
showCount(); // 输出:当前实例数量:0
// 创建两个实例
new Sample();
new Sample();
showCount(); // 输出:当前实例数量:2
}
}
二、静态变量的内存分配
静态变量在内存中只存在一份,不管创建多少个类的实例,静态变量都只有一份拷贝。这与其他非静态成员变量不同,后者在每个实例中都有自己的拷贝。
demo:
public class MemoryAllocation {
// 静态变量
public static int staticVar = 10;
// 非静态变量
public int instanceVar = 20;
public static void main(String[] args) {
MemoryAllocation obj1 = new MemoryAllocation();
MemoryAllocation obj2 = new MemoryAllocation();
// 修改静态变量
obj1.staticVar = 30;
// 输出obj2的静态变量,显示修改是全局的
System.out.println("obj2的静态变量:" + obj2.staticVar); // 输出:obj2的静态变量:30
// 修改非静态变量
obj1.instanceVar = 40;
// 输出obj2的非静态变量,显示修改不影响其他实例
System.out.println("obj2的非静态变量:" + obj2.instanceVar); // 输出:obj2的非静态变量:20
}
}
三、静态方法的特点
静态方法可以直接通过类名调用,不需要创建类的实例。静态方法内部不能直接访问类的非静态成员变量和非静态方法,因为静态方法加载时,类的实例可能还未创建。
demo:
public class StaticMethod {
public static int staticVar = 10;
public int instanceVar = 20;
// 静态方法
public static void staticMethod() {
// 不能直接访问非静态成员
// System.out.println(instanceVar); // 编译错误
System.out.println("静态方法可以访问静态变量:" + staticVar);
}
public void instanceMethod() {
System.out.println("非静态方法可以访问静态变量:" + staticVar);
}
public static void main(String[] args) {
// 直接通过类名调用静态方法
StaticMethod.staticMethod(); // 输出:静态方法可以访问静态变量:10
// 创建实例以调用非静态方法
StaticMethod obj = new StaticMethod();
obj.instanceMethod(); // 输出:非静态方法可以访问静态变量:10
}
}
四、静态代码块
静态代码块是类中用static关键字定义的代码块,它在类加载时执行,并且只执行一次,通常用于初始化静态变量。
demo:
public class StaticBlock {
public static int staticVar;
// 静态代码块
static {
System.out.println("静态代码块执行");
staticVar = 10;
}
public StaticBlock() {
System.out.println("构造函数执行");
}
public static void main(String[] args) {
new StaticBlock(); // 输出:静态代码块执行 构造函数执行
new StaticBlock(); // 输出:构造函数执行
// 静态代码块只执行一次
}
}
以上就是本次分享的所有内容,感兴趣的朋友点个关注呀,感谢大家啦~