Java 中的 static 使用
静态变量
大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!
Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~
使用 static 可以修饰变量、方法和代码块。
例如,我们在类中定义了一个 静态变量 hobby ,操作代码如下所示:
1 package com.citic; 2 3 public class HelloWorld { 4 5 static String hobby="football"; 6 7 public static void main(String[] args) { 8 //静态变量可以直接通过类名直接访问 9 System.out.println(HelloWorld.hobby); 10 //通过创建类的对象,通过对象名来访问静态变量 11 HelloWorld hello=new HelloWorld(); 12 System.out.println(hello.hobby); 13 //使用对象名修改静态变量 14 hello.hobby="baseball"; 15 System.out.println(HelloWorld.hobby); 16 } 17 18 }
要注意:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~
静态方法
与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如:
1 package com.citic; 2 3 public class Demo { 4 5 public static void print() { 6 System.out.println("hello world"); 7 } 8 public static void main(String[] args) { 9 //静态方法可以直接通过类名直接访问 10 Demo.print(); 11 //通过创建类的对象,通过对象名来访问静态方法 12 Demo demo=new Demo(); 13 demo.print(); 14 } 15 16 }
需要注意:
1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员
package com.citic; public class Demo { String name="NewYork"; static String hobby="football"; public static void print() { System.out.println(name); System.out.println(hobby); } }
如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
package com.citic; public class Demo { String name="NewYork"; static String hobby="football"; public static void print() { Demo demo=new Demo(); System.out.println(demo.name); System.out.println(hobby); } }
2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量
package com.citic; public class Demo { String name="NewYork"; static String hobby="football"; public void print() { System.out.println(name); System.out.println(hobby); } }
3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
package com.citic; public class Demo { //普通成员方法 public void show() { System.out.println("welcome"); } //静态方法 public static void print(){ System.out.println("欢迎"); } public static void main(String[] args) { print(); Demo demo=new Demo(); demo.show(); } }
静态初始化块
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
1 package com.citic; 2 3 public class Demo01 { 4 int num1; 5 int num2; 6 static int num3; 7 public Demo01 () { 8 num1=1; 9 System.out.println("构造方法为变量num1赋值"); 10 } 11 {//初始化块 12 num2=2; 13 System.out.println("通过初始化块为变量num2赋值"); 14 } 15 static 16 { 17 num3=3; 18 System.out.println("通过静态初始化块为变量num3赋值"); 19 } 20 public static void main(String[] args) { 21 Demo01 demo01=new Demo01(); 22 System.out.println("-------------------"); 23 System.out.println(); 24 Demo01 demo02=new Demo01(); 25 } 26 }
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 demo02 时并未执行静态初始化块。
浙公网安备 33010602011771号