static关键字
1.static修饰变量也称静态变量,静态变量存放在静态区被该类的所有对象共享。
例如,定义了一个类class User{static Sring city = "a城"},将类中的一个city属性定义为静态变量。我们创建一个对象use1,然后可以通过user1.city = "b城"修改静态区里面User类的信息。User类中city的初始值就发生了改变,变成了b城。我们再新建一个对象use2,打印user2,会发现user2.city变成了b城。
(结合之前讲的内存分析说的,静态区中存放类信息,静态变量等,静态区只有一个,被所有线程共享);
如果没有加static的变量,称为非静态变量,非静态变量只属于对象,每个对象有每个对象的非静态变量。修改非静态变量只会改变单个对象的值,并不会改变类类中的信息。
以下列代码为例:
1 public class TestStatic { 2 public static void main(String[] args){ 3 User a1 = new User(); 4 a1.Info(); 5 a1.city = "b城"; //city为静态变量,修改后存放在静态区的User类中city的信息也被修改了。 6 a1.Info(); //此时类中city的值时“b城” 7 User a2 = new User(); //新建一个对象,输出city我们会发现输出的b城 8 a2.Info(); //说明类中的信息已经被修改,而静态变量被所有对象共享。
9 //如果city没有static修饰,那么修改a1.city修改的只是属于a1的非静态变量, 10 } //并不会改变类中的信息,新建a2输出a2还是a城(city非static修饰时)。 11 } 12 13 class User{ 14 static String city = "a城"; //修改后就相当于static String city = “b城”; 15 void Info(){ 16 System.out.println(city); 17 } 18 }
输出结果:
a城
b城
b城
2.static修饰方法,最主要的目的是可以不用创建对象直接通过类来引用方法,也称类方法可通过类名直接调用。
1 public class TestStatic { 2 public static void main(String[] args){ 3 User.Info(); //没有创建对象,但可以通过类名直接调用方法。 4 } 5 } 6 7 class User{ 8 static String city = "a城"; 9 static void Info(){ 10 System.out.println(city); 11 } 12 }
输出结果:
a城
但有一点需要注意,静态方法中不能调用非静态方法、属性,但非静态方法中可以调用静态方法、属性。
1 class User{ 2 String name; 3 static String city = "a城"; 4 static void Info(){ 5 System.out.println(city); 6 name = "123"; //静态方法中调用了非静态变量或方法是不行的,在name前面加上static就可以了。 7 } //即静态方法中可以调用静态方法和属性。 8 }
1 class User{ 2 static String name; 3 static String city = "a城"; 4 void Info(){ 5 System.out.println(city); 6 name = "123"; //非静态方法中可以调用静态方法和属性。 7 } 8 }