java static 的用法
静态变量(类变量)
特点:可以不初始化实例就直接调用;所有实例共享同一内存空间,类加载时初始化,生命周期持续到程序结束。
示例:统计类实例数量时,可通过静态变量实现全局共享。
1 2 3 4
   | class Counter {     static int count = 0;      Counter() { count++; } }
  | 
 
 
静态方法
特点:可以不初始化实例就直接调用;但不能访问非静态成员 (需通过对象引用)。
典型场景:工具类方法(如数学计算、字符串处理)。
1 2 3
   | class MathUtils {     static int add(int a, int b) { return a + b; }  }
  | 
 
 
静态代码块
作用:类加载时执行一次,相当于在类加载的时候执行的方法体,常用于初始化静态变量或加载资源。
执行顺序:按代码顺序执行,优先于构造方法。
1 2 3 4 5 6
   | class Database {     static Connection conn;     static {         conn = DriverManager.getConnection(...);      } }
  | 
 
 
静态内部类
特点:独立于外部类实例,可直接创建,但仅能访问外部类的静态成员。
示例:实现嵌套工具类或特定设计模式(如 Builder 模式)。
1 2 3 4 5
   | class Outer {     static class Inner {          void display() { System.out.println("独立于外部类实例"); }     } }
  | 
 
 
静态导包
语法:import static java.lang.Math.*;,允许直接调用静态成员而无需类名前缀。
注意:过度使用可能降低代码可读性。
 
kotlin 中与 static 有关的语法
包级函数(顶层函数)
kotlin 允许将函数直接定义到文件中,而不是在 class 内部
1 2 3 4 5 6
   |  val hello = "Hello"
  fun printHello() {     println(hello) }
 
  | 
 
反编译成 java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | @Metadata(    // 省略 ) public final class GlobalFileKt {    @NotNull    private static final String hello = "Hello";
     @NotNull    public static final String getHello() {       return hello;    }
     public static final void printHello() {       System.out.println(hello);    } }
   | 
 
用 java 调用,代码如下:
1 2
   | GlobalFileKt.getHello(); GlobalFileKt.printHello();
   | 
 
修改生成的类名
GlobalFileKt 这个名字是由编译器给我生成的,如果想改,可以使用 @file:JvmName("AAA")
1 2 3 4 5 6 7 8
   | @file:JvmName("AAA") package org.czb
  val hello = "Hello"
  fun printHello() {     println(hello) }
  | 
 
反编译成 java
1 2 3 4 5 6 7 8 9 10 11 12 13
   | public final class AAA {    @NotNull    private static final String hello = "Hello";
     @NotNull    public static final String getHello() {       return hello;    }
     public static final void printHello() {       System.out.println(hello);    } }
  | 
 
object class
object class 本身就是声明成单例类,我看看写法
1 2 3 4 5 6
   | object SingleClass {     val hello = "Hello"     fun printHello() {         println(hello)     } }
  | 
 
反编译成 java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | @Metadata(    // 省略 ) public final class SingleClass {    @NotNull    public static final SingleClass INSTANCE = new SingleClass();    @NotNull    private static final String hello = "Hello";
     private SingleClass() {    }
     @NotNull    public final String getHello() {       return hello;    }
     public final void printHello() {       System.out.println(hello);    } }
   | 
 
用 java 调用,代码如下:
1 2
   | SingleClass.INSTANCE.getHello(); SingleClass.INSTANCE.printHello();
   | 
 
companion object
1 2 3 4 5 6 7 8 9
   | class TestCompanion {     companion object {         var hello = "Hello"
          fun printHello() {             println(hello)         }     } }
  | 
 
反编译成 java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
   | @Metadata(    // 省略 ) public final class TestCompanion {    @NotNull    public static final Companion Companion = new Companion((DefaultConstructorMarker)null);    @NotNull    private static String hello = "Hello";
     @Metadata(       // 省略    )    public static final class Companion {       private Companion() {       }
        @NotNull       public final String getHello() {          return TestCompanion.hello;       }
        public final void setHello(@NotNull String var1) {          Intrinsics.checkNotNullParameter(var1, "<set-?>");          TestCompanion.hello = var1;       }
        public final void printHello() {          System.out.println(this.getHello());       }
               public Companion(DefaultConstructorMarker $constructor_marker) {          this();       }    } }
   | 
 
用 java 调用,代码如下:
1 2
   | TestCompanion.Companion.getHello(); TestCompanion.Companion.printHello();
   | 
 
这个 Companion 其实是一个用内部类实现的单例类
@JvmStatic
在半生对象(companion object)或者 object class 里的方法,在声明函数的时候,也只会生成 final 函数,如果我们想生成 static 函数就可以使用 @JvmStatic 了
1 2 3 4 5 6 7 8 9 10
   | class TestCompanion {     companion object {         var hello = "Hello"
          @JvmStatic         fun printHello() {             println(hello)         }     } }
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | public final class TestCompanion {    @NotNull    public static final Companion Companion = new Companion((DefaultConstructorMarker)null);    @NotNull    private static String hello = "Hello";
     @JvmStatic    public static final void printHello() {       Companion.printHello();    }
     @Metadata(       // 省略    )    public static final class Companion {       private Companion() {       }
        @NotNull       public final String getHello() {          return TestCompanion.hello;       }
        public final void setHello(@NotNull String var1) {          Intrinsics.checkNotNullParameter(var1, "<set-?>");          TestCompanion.hello = var1;       }
        @JvmStatic       public final void printHello() {          System.out.println(this.getHello());       }
               public Companion(DefaultConstructorMarker $constructor_marker) {          this();       }    } }
  |