Java 静态变量和静态方法的特性
类中的内容
-
方法、属性:需要创建对象才能够调用
-
静态属性、静态方法:可以通过类名直接调用,用
static
关键字修饰 -
代码块:创建对象时自动执行一次
-
构造方法
-
无返回值,与类名同名
-
格式:
public 类名(/*参数*/){}
-
创建对象时执行,括号可以用来传参
-
静态属性和静态方法都是唯一的,不会因为创建了多个对象而存在多份。
静态属性
考虑下面这两段代码,猜测Main.java
的执行结果。
//Test.java
package Test;
public class Test {
int a=0;
static int b=0;
{
//代码块
System.out.println("代码块执行");
a+=1;
b+=1;
}
Test(){
//构造函数
System.out.println("构造函数执行");
a+=10;
b+=10;
}
}
//Main.java
package Test;
public class Main {
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
t1.a+=100;
t1.b+=100;
t2.a+=1000;
t2.b+=1000;
System.out.printf("t1.a=%d,t1.b=%d,t2.a=%d,t2.b=%d\n",t1.a,t1.b,t2.a,t2.b);
Test.b+=10000;
System.out.printf("t2.b=%d\n",t2.b);
}
}
Main.java
的执行结果如下
代码块执行
构造函数执行
代码块执行
构造函数执行
t1.a=111,t1.b=1122,t2.a=1011,t2.b=1122
t2.b=11122
根据上述结果可以发现,t1.a
和t2.a
是相互独立的。t1.b=t2.b=1122
说明t1.b
和t2.b
是同一个内存地址,因此,代码块和构造函数执行了两次(因为有2个对象),+100
和+1000
两个操作针对的是同一个b
。而且从t2.b=11122
可知,Test.b
也是针对的同一个b
。
静态方法
static
关键字也可以修饰方法,让方法可以直接通过类名调用。
//Test.java
package Test;
public class Test {
static void func1(String msg){
System.out.println(msg);
}
}
//Main.java
package Test;
public class Main {
public static void main(String[] args) {
Test.func1("静态方法可被直接调用");
Test t = new Test();
t.func1("也可以实例化后调用");
}
}
Main.java
执行结果
静态方法可被直接调用
也可以实例化后调用