1、static修飾的變量和方法,在類加載時即被初始化,可直接通過類名.變量名和類型.方法名進行調用。
2、static修飾的變量,在類加載時會被分配到數據區的方法區。類的實例可共享方法區中的變量。如果static修飾的變量發生改變,那么所有類實例引用的變量都會一起發生改變。
3、static修飾的方法中不能使用this或super,static修飾的方法屬於類的方法,而this或super只是對象的方法。
4、static修飾的方法不能引用非static 修飾的變量, 在類加載過程中,當static修飾的方法加載完成時,非static修飾的變量
還未加載,所以無法引用非static修飾的變量。
5、非static修飾的方法可以引用static 修飾的變量,在類加載過程中,static修飾的變量優先完成加載,所以當非static修飾的方法
完成加載后可以引用static 修飾的變量。
舉例
假設Student 類有static 修飾的變量name和方法getName(String name), 那么是否可以直接通過類名調用呢?
public class Student {
private static String name;
private static void getName(){
System.out.println(name);
}
public static void main(String[] args) {
Student.name = "Jack Ma";
Student.getName();
}
}
運行結果:
Jack Ma
可見,static 修飾的變量和方法是可以直接通過類名調用的。
那么,在static 修飾的main方法內, Student 對象s1 和s2 是否可以直接調用static 修飾的變量和方法呢?
public class Student {
private static String name;
public static void getName(){
System.out.println(name);
}
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "大黃";
s1.getName();
Student s2 = new Student();
s2.name = "二黃";
s2.getName();
}
}
運行結果:
大黃
二黃
從運行結果來看,在static 修飾的main方法內,Student 對象s1 和s2 是可以直接調用static 修飾的變量和方法。
如果此時修改static 修飾的變量name方法,那么Student對象s1, s2調用的變量name是否也會一起被修改呢?
public class Student {
private static String name;
public static void getName(){
System.out.println(name);
}
public static void main(String[] args) {
Student s1 = new Student();
// 修改static 修飾的變量name
s1.name = "Jack";
s1.getName();
Student s2 = new Student();
s2.getName();
}
}
運行結果:
Jack
Jack
從運行結果來看,當對象s1修改了在方法區(數據共享區)的static變量name,那么對象s2調用的static變量name必然會一起被修改。
在static修飾的方法中是否可以應用this呢?
在static修飾的方法中是否可以應用super呢?
在static修飾的方法是否能引用非static 修飾的變量呢?
非static修飾的方法是否能引用static修飾的變量呢?
public class Student {
private static String name;
private int age;
public void getInfo(){
// 非static 方法getInfo()引用static修飾的變量name
System.out.println("姓名:"+ name + ", 年齡" + age);
}
public static void main(String[] args) {
Student s1 = new Student();
//通過類名Student直接調用static 變量 name
Student.name = "Jack Ma";
s1.age = 19;
s1.getInfo();
}
}
運行一下
姓名:Jack Ma, 年齡19
可見,非static修飾的方法可以引用static修飾的變量