上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(六)-CSDN博客
十三、static关键字有什么用?
以下是static
关键字的几种主要用途:
-
创建类方法:
static
关键字可以用来创建类方法,即不需要创建类的实例就可以调用的方法。这些方法通常用于实现与类相关但与类的任何对象无关的功能。public class MathUtils { public static int add(int a, int b) { return a + b; } } // 调用方式:MathUtils.add(5, 10);
-
创建类变量: 使用
static
关键字声明的变量是类变量,也称为静态变量。它们属于类本身,而不是类的某个特定实例。静态变量在类加载时初始化,并且所有实例共享同一个静态变量。public class MyClass { public static int staticVariable; } // 访问方式:MyClass.staticVariable = 10;
-
静态初始化块:
static
关键字还可以用来创建静态初始化块,它在类加载时执行一次。这通常用于初始化静态变量。public class MyClass { static { // 初始化代码 } }
-
静态嵌套类:
static
关键字可以用于创建静态嵌套类,也称为静态内部类。与非静态内部类不同,静态嵌套类不需要外部类的实例就可以被创建。public class OuterClass { public static class StaticNestedClass { // 类体 } } // 创建静态嵌套类的实例:OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
-
静态导入: 在Java 5及以后的版本中,可以使用
static import
语法导入类的静态成员,使得在使用时不必指定类名。import static java.lang.Math.PI; import static java.lang.Math.sqrt; public class MyClass { public double calculateCircleArea(double radius) { return PI * sqrt(radius); } }
-
实现单例模式:
static
关键字在实现单例模式时非常有用,特别是懒汉式单例模式,可以通过一个静态方法来获取类的实例。public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
-
主方法: Java程序的入口点
main
方法也是静态的,因为它不需要创建对象即可执行。public class MyApp { public static void main(String[] args) { // 程序入口代码 } }
static
关键字是Java面向对象编程中的一个核心概念,它允许开发者定义类级别的成员,这些成员不属于任何对象实例,而是属于类本身。
十四、static变量和普通变量的区别?
以下是static
变量与普通变量的主要区别:
-
作用范围:
static
变量(静态变量)属于类本身,而不是类的某个特定实例。这意味着静态变量的副本数量与类的对象数无关,所有对象共享同一个静态变量。- 普通变量(非静态变量或实例变量)属于类的具体对象,每个对象都有自己的普通变量副本。
-
生命周期:
static
变量在类加载到JVM时初始化(如果未显式初始化,则默认初始化),并且在程序结束或类被卸载前一直存在。- 普通变量的生命周期与创建它的对象的生命周期相同,当对象被垃圾回收时,该对象的非静态变量也会被回收。
-
访问方式:
static
变量可以通过类名直接访问,也可以通过类的任何对象访问。- 普通变量只能通过具体的对象实例访问。
-
存储位置:
static
变量存储在Java虚拟机的方法区,这是堆内存的一部分,用于存储类信息。- 普通变量存储在堆内存中的对象实例区域,每个实例都有自己的一份普通变量副本。
-
使用场景:
static
变量适用于存储那些不需要每个对象都有独立副本的数据,如配置参数、全局状态信息等。- 普通变量适用于存储对象特有的状态信息,如对象的属性。
-
与对象的关系:
static
变量不依赖于对象实例,因此它们不能直接访问非静态变量或非静态方法(除非通过对象实例)。- 普通变量属于对象实例,可以直接被对象的非静态方法访问。
-
默认值:
static
变量和普通变量如果未显式初始化,都会有默认值。对于数值类型,默认值为0;对于布尔类型,默认值为false
;对于引用类型,默认值为null
。
示例代码
public class MyClass {
// 静态变量
public static int staticVariable;
// 普通变量
private int instanceVariable;
public static void main(String[] args) {
// 直接使用类名访问静态变量
System.out.println(MyClass.staticVariable);
// 创建对象后,使用对象访问普通变量
MyClass myObject = new MyClass();
System.out.println(myObject.instanceVariable);
}
}
在这个示例中,staticVariable
是静态变量,可以通过MyClass.staticVariable
直接访问。而instanceVariable
是普通变量,需要创建MyClass
的对象后才能访问。
总结来说,static
变量是类的一部分,与类的所有实例共享;而普通变量是对象的一部分,每个实例都有其独立的副本。正确使用这两种变量对于程序设计和内存管理都是非常重要的。