1.static
叫静态,可以修饰成员变量、成员方法。
2.成员变量按照有无static修饰,分为两种:
①类变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享(不管那个类调用的,都是使用这一个变量,用的都是同一个地址,使用你上面给它赋值,然后下一行代码有赋值,就是改变了他的内容,不管说不定同一个new出来的)。
②实例变量(对象的变量):无static修饰,属于每个对象的。
使用方法
3.成员变量的执行原理
①类变量:属于类,与类一起加载一次,在内存中只有一份,可以被类和类的所有对象共享
②实例变量:属于对象,每个对象中都有一份,只能用对象访问。
③分析过程:
运行第一行代码:class在方法区内加载Test.calss。
运行第二行代码:在栈内存中加载一个main空间。
运行第三行代码:在方法区加载Student.class,然后加载Student.calss内的成员变量,发现name是类变量,会在堆中加载一个单独属于static String name的空间,然后Student.class中的name就指向这个空间,然后将"袁华"赋值给static String name空间。
运行第四行代码:发现有new在栈中的main方法中创建一个为Student s1的空间,然后在堆内存中创建一个属于s1的空间,叫将地址值交给栈中的Studnet s1空间。
运行第五行代码:给s1的name赋值,就是给堆中static String name空间赋值,将原有的覆盖掉,然后他就变成了"马冬梅"。
运行第六行代码:发现有new,在栈内存的main空间内创建一个Student s2的空间,然后在堆内存中创建一个s2空间,将地址值给栈内存中的Student s2空间,使得栈内存中的Student s2空间指向堆内存中的s2空间。
运行第七行代码:给s2中的name赋值,就是给堆中static String name空间赋值,将原有的覆盖掉,然后他就变成了"秋雅"。
运行第八行代码:调用输出,s1的name,先会在栈内存中找到Student s1空间中的地址值,根据地址值找到堆内存中的s1空间,发现没有name,然后在根据地址找到方法区内的Student.class方法,找到name,然后根据name的地址值,找到堆内存中的static String name空间,然后将"秋雅"打印出来。
运行第九行代码:调用输出,s2的name,先会在栈内存中找到Student s2空间中的地址值,根据地址值找到堆内存中的s2空间,发现没有name,然后在根据地址找到方法区内的Student.class方法,找到name,然后根据name的地址值,找到堆内存中的static String name空间,然后将"秋雅"打印出来。
运行第十行代码:给s1中的age赋值,先找到栈内存中的Student s1空间,然后根据地址值找到堆内存中的s1空间,给int age赋值为23.
运行第十一行代码:给s2中的age赋值,先找到栈内存中的Student s2空间,然后根据地址值找到堆内存中的s1空间,给int age赋值为18.
运行第十二行代码:打算输出:s1的age,先在栈内存中找到Student s1空间,然后根据地址值找到堆内存中的s1空间,然后将int age的值打印出来。
最后退出运行。
4.类变量的应用场景
在开发中,如果某个数据只需要一份,且希望能够被共享(访问,修改),则该数据可以定义成立类变量来记住。
注意:在同一个类中,访问自己类的类变量,才可以省略类名不写。