之前我們學習了JAVA 面向對象的一些基本知識,今天來進階一下!!!
static關鍵字
static表示靜態,是JAVA中的一個修飾符,可以修飾成員方法,成員變量,可用于修飾類的成員(變量、方法、代碼塊)和嵌套類。
靜態變量
靜態變量屬于類,并非類的某個實例。
無論創建多少個類的對象,靜態變量只有一份存儲在內存中。
靜態變量可通過類名直接訪問,也能通過對象實例訪問。
class Student {static int totalStudents; // 靜態變量,記錄學生總數//被所有 Student 對象共享。每創建一個 Student 對象,totalStudents 的值就會加 1。String name;public Student(String name) {this.name = name;totalStudents++; // 每創建一個學生對象,總數加 1}
}public class StaticVariableExample {public static void main(String[] args) {Student s1 = new Student("Alice"); //new關鍵字,堆內存Student s2 = new Student("Bob");System.out.println("Total students: " + Student.totalStudents); // 通過類名訪問靜態變量System.out.println("Total students (via s1): " + s1.totalStudents); // 通過對象實例訪問靜態變量}
}
靜態方法
靜態方法屬于類,而非類的某個實例;
可以通過類名直接調用靜態方法,無需創建類的對象;
靜態方法只能訪問靜態成員(靜態變量和靜態方法),不能訪問實例成員(實例變量和實例方法),因為靜態方法在類加載時就已存在,此時可能還沒有創建對象。
class MathUtils {static int add(int a, int b) { // 靜態方法return a + b;}
}public class StaticMethodExample {public static void main(String[] args) {int result = MathUtils.add(3, 5); // 通過類名調用靜態方法System.out.println("3 + 5 = " + result);}
}
拓展:工具類
工具類是幫我們做一些事情的,但是不描述任何事物的類!
JavaBean類 | 用來描述一類事物的類 e.g. Student,Teacher,Dog,Cat 等 |
測試類 | 用來檢查其他類是否書寫正確,帶有main方法的類,使程序的入口 |
工具類 | 幫我們做一些事情的,但是不描述任何事物的類 |
?工具類書寫規則:
1.類名見名知意
2.私有化構造方法??? ? ? ? ? ? ? ? ? ??
public class ArrUtil{private ArrUtil(){}
}
3.方法定義為靜態? ? ?
? ?
靜態代碼塊
靜態代碼塊在類加載時執行,且僅執行一次。它通常用于對靜態變量進行初始化操作。
class MyClass {static int value;static {// 靜態代碼塊value = 10; //對value靜態變量進行初始化System.out.println("Static block executed.");}
}public class StaticBlockExample {public static void main(String[] args) {System.out.println("Value: " + MyClass.value);}
}
靜態嵌套類
靜態嵌套類是定義在另一個類內部的靜態類。它可以直接訪問外部類的靜態成員,但不能直接訪問外部類的實例成員。
class OuterClass {static int outerStaticVar = 10;int outerInstanceVar = 20;static class StaticNestedClass {void display() {System.out.println("Outer static variable: " + outerStaticVar);// 不能訪問 outerInstanceVar,因為它是實例變量// System.out.println("Outer instance variable: " + outerInstanceVar); }}
}public class StaticNestedClassExample {public static void main(String[] args) {OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();nested.display();}
}
StaticNestedClass
?是靜態嵌套類,可直接訪問外部類的靜態變量?outerStaticVar
。
static的注意事項
1.靜態方法只能訪問靜態變量和靜態方法;
2.非靜態方法可以訪問靜態變量或者靜態方法,也可以訪問非靜態成員的成員變量和非靜態的成員方法;
3.靜態方法中是沒有this關鍵字的。
? ? ? ??
重新認識main方法
public class HelloWorld{public static void main(String[] args){System.out.println("HelloWorld");}
}
public | 被JVM調用,訪問權限足夠大 |
static | 被JVM調用,不用創建對象,直接類名訪問 因為main方法是靜態的,所以測試類中的其他方法也需要是靜態的 |
void | 被JVM調用,不需要給JVM返回值 |
main | 一個通用的名稱,雖然不是關鍵字,但是被JVM識別 |
?