本文最后更新于:2024年3月18日 凌晨
Java 静态变量与静态方法
静态变量
用static修饰符修饰的属性是仅属于类的静态属性,相应的成员变量也称静态变量或者类变量。
静态变量的访问形式
静态变量通常是通过类名作为前缀来访问的,通过对象作前缀也可以访问,在本类中甚至可以通过变量名直接访问,例如:
-
在本例中直接访问:k++
-
通过类名作前缀访问:A.k
-
通过类的一个对象作前缀访问:x1.k++
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class A{ static int k = 3; public static void main(String []args){ A x1 = new A(); x1.k++; A x2 = new A(); x2.k = 5; k++; System.out.println("k="+A.k); } }
k=6
|
注意:静态变量在存储上归属类空间,不依赖任何对象,通过对象去访问静态变量实质上还是访问类空间的那个变量。
给静态变量赋初值
在加载类代码时,Java运行系统将自动给类的静态变量分配空间,并按默认赋值原则以及定义变量时的设置赋初值,静态变量也可以通过静态初始代码块赋初值,静态初始代码块与对象初始代码块的差别是在大括号前加有static修饰,如下所示:
注意:静态初始化代码的执行是在main()方法执行前完成的。
[例5-3]:静态空间与对象空间的对比
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 40 41 42
| class TalkPlace{ static String talkArea = ""; } public class User{ static int count = 0; String username; int age;
public User(String name, int yourage){ username = name;; age = yourage; }
void log(){ count++; System.out.println("you are no."+count+"user"); }
void speak(String words){ TalkPlace.talkArea=TalkPlace.talkArea+username+"说:"+words+"\n"; }
public static void main(String args[]){ User x1 = new User("张三",20); x1.log(); x1.speak("hello"); User x2 = new User("李四",16); x2.log(); x2.speak("good morning"); x1.speak("bye"); System.out.println("--讨论区内容如下:"); System.out.println(TalkPlace.talkArea); } }
you are no.1 user you are no.1 user --讨论区内容如下: 张三说: hello 李四说: good morning 张三说: bye
|
说明:本例包含两个类,第1~3行是TalkPlace类,第5~39行是User类,在User类中有3个属性,其中,username和age为实例变量,它们的值取决于对象,实例变量在对象空间分配存储单元,每个对象有各自的存储空间,User类的另一个属性count为静态变量,其值可以为类的所有成员共享,静态变量在类空间分配单元,由于静态变量时共享的,在实例方法中可以直接访问同一类的静态变量,但要访问另一类的静态变量必须以另一类的对象或类名作前缀才能访问。
静态方法
用static修饰符修饰的方法称为静态方法,也叫类方法,调用静态方法,一般使用类名做前缀,当然,也可以通过变量来调用,但必须清楚的是它不依赖任何对象,在static方法中能处理静态变量,也可访问其他static方法,但绝不能访问任何归属对象空间的变量或方法。
[例5-4]:求10~100之间的所有素数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class findPrime{ public static boolean prime(int n){ for(int k = 2;k <= Math.sqrt(n);k++){ if(n%k == 0) return false; } return true; }
public static void main(String args[]){ for(int m = 10;m <= 100;m++){ if(prime(m)) System.out.println(m+","); } } }
|
说明:该程序中将求素数的方法编写为静态方法是最好的选择,通常,数学运算函数均可考虑设计为静态方法,在main()方法中可以直接调用prime()方法。