- static关键字用于共享同一份数据,在类里面,当成员变量使用了static关键字之后,这个变量就属于这个类,而不是单独属于某个对象,所有的这个类的实例对象的这个static关键字的属性都是同一份数据,在堆内存里面使用的是同一个变量地址,所以当任意一个实例对象改变了static关键字修饰的成员变量之后,其他所有实例对象的对应的属性值也会变,因为共享使用一个堆中的变量。
- 不加static关键字的成员变量属于实例化后的对象,而加了static关键字之后,这个成员变量就不再独属于某个对象,而是属于整个类的,被所有实例化的对象共享,这时,可以使用类.成员属性来访问这个公共的成员变量,也可以使用对象.成员属性来访问,但是推荐使用前者
- 加了static关键字的成员方法也是一样,属于整个类的方法,而不是独属于某一个对象,推荐使用类.成员方法的方式来调用这个成员方法
- 注意:
- 非静态方法不能访问静态方法,只有静态方法才可以访问静态方法(静态方法是更高一级的跟main同级的方法,非静态方法找不到静态方法)
- java是基于c语言写的,所以代码的底层执行流程肯定还是自顶向下的,被调用的方法肯定在调用的方法之前,c中执行是从main函数开始,Java也是,Java中的main方法使用了static关键字提高了执行的优先级,而static关键字修饰的成员变量和成员函数是类层级的,跟main同级,其他方法是更低一级的。当程序执行main方法的时候,会执行main中的被调用的成员函数,根据自顶向下的原则,这个被调用的成员函数必须要是跟main同级并且在main之前被创建,这时候main函数才可以成功调用这个成员函数,否则会找不到这个函数。我们其实只需要将成员函数的等级提升到跟main同级别,也就是static类级别,Java中自动帮我们先创建非main方法的其他同级方法,后面才执行main方法调用这些方法。
- 静态方法和静态代码是等级最高的,甚至比构造方法的优先级还高,在构造方法执行之前就已经被执行了,并且静态方法只被执行唯一的一次。比如当创建两个对象的时候,其实只执行了类中的非main函数的静态代码一次,这个过程都是在main函数里面执行,main执行结束之后程序就结束了,而非静态代码可以重复执行。
-
static关键字的共享数据
public class static1 {public static void main(String[] args) {test();}public static void test(){Student s=new Student("zs",18,"h111");System.out.println(s.getName()+s.getAge()+s.getRoom());Student s1=new Student("ls",19,"h222");System.out.println(s.getName()+s.getAge()+s.getRoom());System.out.println(s1.getName()+s1.getAge()+s1.getRoom());} }public class Student { // 属性设置为privateprivate String name;private int age;private static String room;//无参数构造public Student() {}//有参数构造public Student(String name, int age, String room) {this.name = name;this.age = age;this.room=room;}//getter方法public String getName() {return name;}public int getAge() {return age;}public static String getRoom() {return room;}//setter方法public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public static void setRoom(String room) {Student.room = room;} }