1.static,本意静态的,与它对应的是非静态的。其实我觉得静态的和非静态的最本质的区别是他们创建的时机,以及他们归谁所有。有static关键字修饰的变量或者方法,也就是静态变量,静态方法,或者说静态成员,或者说类成员。这些都是它的名字。
首先是静态变量,它是在类被载入的时候创建的,归类所有。而区别于非静态变量,是在对象创建的时候创建的。它归对象所有,对象之间的非静态成员互不干扰。
下面例子:
public class StaticClassTest {
private static int age1=1;
private int age2=1;
public void changeAge(){
age1++;
age2++;
System.out.println("age1 is "+age1+", age2 is"+age2);
}
}
public class MainClass {
public static void main(String[] args) {
StaticClassTest st1=new StaticClassTest();
st1.changeAge();
StaticClassTest st2=new StaticClassTest();
st2.changeAge();
}
}
运行的结果是
age1 is 2, age2 is2
age1 is 3, age2 is2
对于静态变量age1而言,它是归类所有的,也可以说是归所有对象所有的,所以对象st1和对象st2所拥有的age1其实是同一份,任何一个对象对静态变量进行了改变,其结果都会反映在其他的对象上面。而age2因为不是静态变量,所以st1对它的修改,并不会反映在对象st2上面,也就是说它是归对象所有的,而不是归类所有。
2.其实静态方法我觉得最大的特点,就是它可以直接用类名进行调用,而不需要先生成一个对象,当然你要生成一个对象再去调用静态方法也是可以的。但这只是java给我们的自由。本意上,静态方法,表示的是这个方法归类所有,它是不需要创建对象就能使用的。所以在该静态方法里,你不能去调用任何需要产生对象才能生成的变量。也就是,在静态方法中,你不能调用非静态变量,你也不能调用this和super关键字,因为这些都是需要产生对象才生成的。
下面例子:
public class StaticClassTest {
private static int age1=1;
private int age2=1;
public static void changeAge(){
age1++;
age2++;
System.out.println("age1 is "+age1+", age2 is"+age2);
}
}
在eclipse里会报错,错误为:
Cannot make a static reference to the non-static field age2
就是说,在静态方法中,不能引用非静态的变量age2.
下面例子:
public class StaticClassTest {
private static int age1=1;
private int age2=1;
public static void changeAge(){
this.age1++;
this.age2++;
System.out.println("age1 is "+age1+", age2 is"+age2);
}
}
同样也会收到错误。
3.静态代码块。
静态代码块可以放在任何地方,它以static关键字来标记,以括号包围起来。当类首次被载入的时候,静态代码块执行,此后再载入,就不会执行了,也就是说静态代码块只在类初次载入的时候被执行一次。看下面代码》
public class StaticClassTest {
protected static int age1=1;
private int age2=1;
static{
age1++;
System.out.println("today is saturday");
}
public static void changeAge(){
System.out.println("superclass age1= "+age1);
}
}
public static void main(String[] args) {
StaticClassTest.changeAge();
StaticClassTest.changeAge();
}
如果观察运行结果,可以看到,控制台首先会打出today is saturday 这条语句,而后马上没有了。这是因为我在main方法中载入了两次类。但是我们依然可以通过输出的结果来发现问题。
superclass age1= 2
superclass age1= 2
上述结果说明,age1++这行代码只被执行了一次,也就是在第一个 StaticClassTest.changeAge();语句的时候执行。随后就没有再被执行了。
4.静态方法能不能被重写呢?
5.关于静态的类,什么时候用到静态类呢?