在摆实例之前,先搞一些总结上去。。。。
static(静态\修饰符)
1. static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
静态成员变量的访问方式:
方式1: 可以使用对象进行访问。
格式: 对象.变量名。
方式二: 可以使用类名进行访问。
格式: 类名.变量名;
注意:
1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候
才使用static修饰。
static修饰成员变量的应用场景: 如果一个数据需要被所有对象共享使用的时候,这时候即可好实用static修饰。
2. static修饰成员函数:(后续补充)
---------------------------------------------------------------------------------------------------------------------------------------------
明白了以上东西后可以写一个例子;描述一个女子学校的学生
首先我们看下没有static修饰的情况下,代码执行时的内存情况:
先上代码:
1 class Student{ 2 String name; 3 String sex; 4 public Student(String name,String sex){ 5 this.name = name; 6 } 7 } 8 9 class Main{ 10 public static void main(String[] args) 11 { 12 Student s1 = new Student("周芷若","女"); 13 Student s2 = new Student("周敏","女"); 14 15 System.out.println("名字:"+ s1.name+"性别"+s1.sex); 16 System.out.println("名字:"+ s2.name+"性别"+s2.sex); 17 }18 }
如上代码在执行时在内存中的存储情况如图
可以看到在上面的代码执行过程中每创建一个对象,就会在堆内存中保存一份姓名,一份性别,但是看需求,我们是要描述一个女子学校,那么女子学校当然只有女生了
那么这种写法不想当于浪费内存了?
解决办法:将性别作为一个可以公共访问的属性,让其在内存中只存一份
那么代码来了。。。
1 class Student{ 2 String name; //非静态成员变量 3 static String sex = "女"; //静态的成员变量 4 public Student(String name){ 5 this.name = name; 6 } 7 } 8 9 class Main { 10 public static void main(String[] args) 11 { 12 Student s1 = new Student("周芷若"); 13 Student s2 = new Student("赵敏"); 14 System.out.println("名字:"+ s1.name+"性别"+s1.sex); 15 System.out.println("名字:"+ s2.name+"性别"+s2.sex); 16 } 17 }
如上将成员变量使用静态修饰符static修饰之后,它会在内存中存一份,所有对象都会调用到该成员变量,在内存中保存如下:
说明:在内存中会有一个方法区(数据共享区),专门存放供公共调用得到数据或者方法
当使用静态修饰符static修饰成员变量的时候,会把这个变量存放在方法区中,供所有对象去调用(当然它被修改,则其他对象调用时获取到的数据也会修改),当然我们在使用static的时候也一定要在需要的时候添加,否则会导致获取到重复数据(比如如果在上面例子中给name成员变量添加了static,则所有人姓名都一样了,显然是不合理的)
原文地址:https://www.cnblogs.com/qkblogs/p/12643973.html