在Java中,static是一个关键字,它可以用来修饰属性、方法和内部类。使用static修饰的成员被称为静态成员。 1. 静态属性:使用static修饰的属性被称为静态属性,它属于类而不是实例。所有的实例共享同一个静态属性的值。可以直接通过类名访问静态属性。 2. 静态方法:使用static修饰的方法被称为静态方法,它不依赖于任何实例,可以直接通过类名调用。静态方法不能访问非静态的成员,因为它们没有隐式的this引用。 3. 静态块:使用static修饰的代码块被称为静态块。它在类加载时执行,并且只会执行一次。静态块常用于初始化静态属性。 4. 静态内部类:使用static修饰的内部类被称为静态内部类。静态内部类与外部类的实例无关,可以直接通过外部类名直接访问。 使用static修饰的成员有以下特点: - 可以直接通过类名访问,不需要创建对象 - 所有实例共享同一个静态成员 - 静态成员在类加载时初始化,且只会初始化一次 注意事项: - 静态成员不能访问非静态成员,因为非静态成员依赖于实例的创建 - 非静态成员可以访问静态成员 - 静态方法不能被子类重写,但可以被继承并通过子类调用 - 静态块在类加载时执行,且只会执行一次 public class StaticTest01 { //静态属性也叫类变量还叫静态变量,属于类的 public static int age; public int no; //静态变量是在类加载的时候初始化的 public static double score = 99; //静态变量由于是在类加载的时候初始化,所以要在声明的同时初始化,否则编译报错 public static final double PI=3.14; public static void main(String[] args) { //static int a;//没有静态的局部变量 //静态变量如何调用 //1.类名.静态变量名或静态常量名(推荐使用) System.out.println(StaticTest01.age); System.out.println(StaticTest01.PI); //System.out.println(StaticTest01.no); StaticTest01 st = new StaticTest01(); //2.对象名.静态变量名或静态常量名 System.out.println(st.age); System.out.println(st.PI); System.out.println(st.no); } }
静态方法是指在类中定义的方法,在调用时不需要创建类的实例即可使用。静态方法与类相关,而不是与类的实例相关。 在静态方法中,不能直接使用类中的非静态属性和方法,因为非静态属性和方法是与类的实例相关的。但是静态方法可以访问和修改静态属性。 静态方法的定义使用关键字"static"修饰,通常在方法名前面加上关键字"static",如下所示: ```java public static void staticMethod() { // 静态方法的实现 } ``` 静态方法可以通过类名直接调用,而不需要创建类的实例。例如: ```java ClassName.staticMethod(); ``` 静态方法的特点: 1. 静态方法是属于类的,而不是属于类的实例。 2. 静态方法可以直接调用,不需要创建类的实例。 3. 静态方法中只能访问静态属性和调用静态方法。 4. 静态方法不允许使用this关键字,因为this关键字指向类的实例,而静态方法中没有类的实例。 5. 静态方法可以被继承,但不能被重写(覆盖)。 6. 静态方法可以被重载。 7. 静态方法不能访问非静态属性和调用非静态方法,因为非静态属性和方法是与类的实例相关的,而静态方法不依赖于类的实例。 public class StaticTest02 { public int no; public static int age; //静态方法的定义形式为 //权限修饰符 static 返回值类型 方法名([参数类型 参数名]){方法体} //静态方法中不能直接调用非静态的属性和非静态的方法,但是可以直接调用静态属性和静态方法 public static void doSomething(){ //System.out.println(no); System.out.println(age); method1(); //method2(); //如果非要在静态方法中调用非静态成员可以通过创建对象的形式进行间接调用 StaticTest02 st = new StaticTest02(); System.out.println(st.no); st.method2(); } //在非静态方法中,可以直接调用静态变量,静态方法,和非静态变量,非静态方法 public void saySomething(){ System.out.println(no); System.out.println(age); method1(); method2(); } public static void method1(){}; public void method2(){}; public static void main(String[] args) { //静态方法如何调用 //1.类名.静态方法名(推荐使用) StaticTest02.method1(); //2.对象名.静态方法名 StaticTest02 st = new StaticTest02(); st.method1(); } }
static块也称为静态块,是一个Java类中的一个特殊块,在类加载时执行且只执行一次。它不能被显式地调用,会在类的静态变量初始化之后执行。 static块在类加载时被执行的主要目的是对静态变量进行初始化或执行一些静态块中的代码,例如加载数据库驱动、初始化静态资源等。 static块的语法结构如下: ``` static { // 静态块中的代码 } ``` 静态块的特点如下: 1. 静态块只会执行一次,且在类加载时执行。 2. 静态块中可以包含任意的Java代码,例如变量的初始化、方法的调用等。 3. 静态块中可以访问静态的成员变量和方法,但不能访问非静态的成员变量和方法。 4. 静态块中的代码执行顺序与它们在类中的定义顺序相同。 使用静态块可以在类加载时进行一些必要的初始化操作,提高代码的效率和可靠性。静态块常用的场景包括初始化静态变量、加载配置文件、注册驱动等。 public class StaticTest03 { //Static块,为类进行初始化工作的,实际就是为静态属性初始化 static int age; static { System.out.println(age); age=30; System.out.println("静态块的代码"); //System.out.println(no); } static int no; public static void main(String[] args) { System.out.println("main方法的代码"); System.out.println(StaticTest03.age); } }