java面向对象之static修饰符
Posted 柚子李子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面向对象之static修饰符相关的知识,希望对你有一定的参考价值。
在摆实例之前,先搞一些总结上去。。。。
static(静态\\修饰符)
1. static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
静态成员变量的访问方式:
方式1: 可以使用对象进行访问。
格式: 对象.变量名。
方式二: 可以使用类名进行访问。
格式: 类名.变量名;
注意:
1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候
才使用static修饰。
static修饰成员变量的应用场景: 如果一个数据需要被所有对象共享使用的时候,这时候即可好实用static修饰。
2. static修饰成员函数:(后续补充)---2020-04-08补充
static静态修饰符不仅可以修饰成员变量,还可以修饰成员函数,
静态函数(方法)在使用过程中的注意事项:
1.静态方法可以使用对象或者类名调用,非静态方法只能使用对象调用
2.静态方法可以调用静态成员变量,不能调用非静态成员变量和非静态方法,非静态方法可以调用非静态和静态的方法和变量;
3.静态方法中不能使用this或者super关键字
原因:静态数据是优先于变量存在于内存中的,非静态变量和函数是在新建对象的时候在内存中出现,而在创建对象之前静态数据就已经存在于静态方法区了(内存管理相关内容,不在赘述)
使用场景:在不需要访问成员变量或方法的时候可以使用静态方法,一般用于工具类(不涉及数据传输,只涉及功能)
---------------------------------------------------------------------------------------------------------------------------------------------
明白了以上东西后可以写一个例子;描述一个女子学校的学生
首先我们看下没有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,则所有人姓名都一样了,显然是不合理的)
以上是关于java面向对象之static修饰符的主要内容,如果未能解决你的问题,请参考以下文章
Java面向对象(OOP)--static修饰符(static变量static方法代码块和静态代码块创建和初始化对象的过程静态导入)