在Java里面,static可以定义属性、方法。
一、使用static定义属性
写一个程序要求定义出一个表示所有清华大学学校的学生信息,那么就证明学生类里面需要提供一个学校的信息,表示所在的学校,按照之前的内容,代码如下:
此时每一个对象之中都占用一个“school”属性,而且这些属性只有通过student类产生的对象,都应该是相同的那么就是说现在student类产生了10w个对象,若修改时则需要对每个属性都要修改;设计不合理,应该将School这个属性作为一个公共属性出现,节省空间方便数据的统一维护;
1. 使用static关键字声明的属性就是公共属性;
范例一:
当修改一个属性的时候所有对象的school属性都修改了
结论:school是一个公共属性,而此属性不在保存在堆内存中,会保存在一个称为“全局数据区”的内存区域;
以上代码并不规范,既然是公共属性,就应该由最高代表类进行操作;
2. 使用static定义的属性往往会通过类名称直接调用;
3. 由于static存在由类名称直接调用的特点,所以static属性又被称为“类属性”,而且static属性可以在一个类没有实例化对象的时候直接进行访问
现在为止会发现类中的属性分为两种:普通属性、static属性;那么在设计的时候优先考虑的是普通属性;
二、使用static定义方法
既然使用static定义的属性可以通过类名称直接访问,那么使用static定义的方法也一定可以直接访问,而且使用static定义的方法其主要目的就是为了操作static属性。
范例:static方法的使用
在开发之中肯定优先考虑普通方法,但是对于类中的方法有两类:普通方法、static方法,而这两类方法调用上是有限制的
1)使用static方法只能够调用static属性和static方法,不能够调用任何非static操作;
2)使用非static方法可以调用任何的static属性或static方法
思考:为何会出现这样的情况:
首先static方法和非static方法调用的时机是不同的。Static方法可以由类名称直接调用,那么在调用的时候可以没有实例化对象产生;而非static方法,必须在有实例化对象产生之后才可以调用(对象实例化之后会开辟堆内存空间,在堆内存空间之中要保存属性信息);
虽然static定义的属性和方法是在类之中定义的,但是却独立于对象的控制;那么只有在一中情况下回选择定义static方法:如果一个类之中没有任何的属性存在,那么就可以考虑将所有的方法都定义为static;
三、主方法总的static
1. 在主类里编写方法
范例:
结论:如果此时fun()方法上没有static,则表示static方法(main())要去调用非static方法(fun()),这样是无法调用的,因为普通方法要先实例化对象
2. 分析主方法的组成:
❶public:这是一种权限,表示公共的都可以访问
❷static :表示此方法可以由类名称直接调用
❸void :主方法是一切的开始,只要开头了就没有回头路了
❹main( ):是一个默认定义好的方法名称,使用Java解释类要找main方法
❺String args[ ]:接受的参数
四、static的使用
功能1:作为统计记录使用
有一个类要求可以统计出类之中产生过多少个实例化对象,则就可以利用static进行统计;由于每个新对象实例化的时候一定要调用构造方法,所以可以在构造方法里增加统计操作;
功能2:实现对象的自动命名
若Person类里有一个name属性,同时提供有两个构造方法(无参和一个参数),通过一个可以由外部设置设置人的名字,但是如果调用的是一个无参构造,则不希望name属性的内容是null,给他一个默认名字“无名氏-编号”,编号不应重复,可以利用static统计;