1、引言
相信大家在学习Java的过程中,面对static成员变量或成员方法,都好像云里雾里的,分不清普通成员和static成员,也不知道该怎么正确使用static,经常在static成员方法中调用了普通成员方法,导致编译出错,这使我们非常的头疼,接下来,就让我来为大家解决static所带来的问题~
2、static的使用场景
我们以一个类来引出static
我们先定义一个学生类,一个学生类当中应该有姓名、性别、年龄、班级等信息:
但是,如果这个类实例化出的所有的对象都在同一个班级,那这个班级的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享,这时就需要static的出场了。
3、static成员内存中的存储位置
当我们用static来修饰成员后(无论是成员变量还是成员方法),他们的位置都存储在方法区。
4、static修饰成员变量
如果所有对象的班级是相同的,那我们就可以使用static来修饰班级这个属性:
当普通成员变量被static修饰成为静态成员变量后,这个成员变量就不再属于某一对象的了,而是属于类的,也称为类变量(所有对象共享的变量)。
4.1 访问静态成员变量
访问静态成员变量有两种形式:
1、通过对象的引用进行访问
2、通过类名进行访问
虽然这两种访问形式都可以,但是我们更推荐第二种,通过类名来访问静态成员变量,因为这个成员变量是属于类的,而不是属于对象的。
在这里,我们需要记住一句话:
静态的成员,不依赖与对象。意味着,不需要通过对象的引用来访问。
而且,我们可以发现,对于静态的成员变量,我们根本不需要去实例化出一个对象,我们可以直接通过类名来访问静态成员:
也就是说,静态的成员在类加载的时候就被创建了。
故:当Java虚拟机(JVM)加载类时,它会为静态方法在内存中分配空间,使得静态方法可以在不实例化对象的情况下被调用。
我们可以对静态成员变量总结以下特征:
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
4.2 访问静态成员方法
其实静态成员方法与静态成员变量是类似的,不是属于某一对象的方法,而是属于类的方法,
但是我们需要注意:
在静态方法中不能调用任何非静态方法、不能访问任何非静态成员变量。
解1:这是因为,静态的方法不属于某一对象,而任何的普通方法、普通成员变量都是属于某一对象的,而且普通方法会有默认的this参数(当前对象的引用),而在静态方法中,根本就没有对象之说,更没有对象的引用了,故无法给普通成员变量提供this参数,故在静态方法中不能调用任何非静态方法、也不能访问任何非静态成员变量。
解2:静态方法在JVM加载类时就被分配了内存空间,也就是说先进入了内存,而普通方法还没有进入内存,故在静态方法中不能调用普通方法。
在普通方法中可以调用静态方法。
解:静态方法先进入了内存,已经在内存中存在了,而普通方法后进入内存,后进入内存的也存在了,所以后进入内存的当然可以调用先进入内存的~故普通方法可以调用静态方法。
即:
我们可以对静态成员变量总结以下特征:
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
OK~本次博客到这里就结束了,
感谢大家的阅读~欢迎大家在评论区交流问题~
如果博客出现错误可以提在评论区~
创作不易,请大家多多支持~