
1. 概念
在Java类中,由static修饰的属性(成员变量)叫做静态变量,也叫类变量。而被static修饰的常量就叫做静态常量,静态变量和静态常量统称为静态成员。注意,局部变量不能被声明为静态变量。对于静态变量和静态常量来说,无论一个类实例化出来多少个对象,它的静态成员都只有一份拷贝,可以被所有的对象共享。
对实例变量来说,每个实例对象都有自己独立的变量,各个实例对象中的同名变量互不影响。但是对于静态变量来说,无论修改哪个实例对象的静态变量,效果其实都是一样的。也就是说,所有实例对象的静态变量都会被修改,原因在于静态变量并不属于某个单独的实例对象所有。
所以当我们需要在多个对象之间进行信息共享的时候,就可以考虑使用静态变量或静态常量,增加实例之间的交互性。而如果类的所有实例对象都包含一个相同的常量属性,我们就可以把这个属性定义为静态常量,以此节省内存空间。
可以说,实例成员在每个实例对象中都有自己的一个独立的私有“空间”,但是静态成员只有一个共享的公共“空间”,所有实例对象都会共享该静态成员。
2. 语法
对于静态变量或静态常量,我们可以通过如下格式调用:类名.变量名类名.常量名
3.静态变量与实例变量的区别
我们现在已经知道什么是静态变量,什么是实例变量(成员变量)了,那么两者的区别有哪些呢?壹哥给大家总结一下。
3.1 静态变量
● JVM虚拟机只会为静态变量分配一次内存,在加载类的过程中完成对静态变量的内存分配; ● 我们可以在类的任意方法中直接访问任意静态变量; ● 我们可以在其他类中通过"类名.静态变量"的形式,来访问该类中的静态变量。
3.2实例变量
● 每创建一个Java实例对象,JVM虚拟机就会为该实例变量分配一次内存; ● 我们可以在类的非静态方法中直接访问实例变量; ● 在类的静态方法中,需要通过"对象.实例变量"的形式进行访问。
4. 案例
4.1 定义静态属性和常量
我们来定义一个Student类,在该类中定义如下几个成员变量、静态变量和静态常量。
4.2 定义测试类
接下来我们再来定义一个测试类,看看如何在代码中调用这些成员变量、静态变量等。对于静态变量和静态常量,我们要通过”类名.静态成员“的形式进行调用,但是不建议通过“对象.静态变量”的形式来调用静态变量,虽然这样调用也不会报错!如果这样调用,会提示”静态属性应该通过静态方式来访问,The static field Student.className should be accessed in a static way”。
从上述案例中,我们可以总结出如下规律: ● 对于成员变量,要通过“对象.变量名”的形式调用; ● 成员变量属于某个对象,属于对象自己的“私有财产”,不能被整个类共享,对象之间不能共享这些成员变量; ● 静态变量和静态常量属于整个类,可以被类的所有对象共享,属于“公共财产”; ● 在同一个类中,我们可以在静态方法中直接调用静态成员,也可以通过“类名.静态成员”,或“对象.静态成员”的方式进行调用; ● 虽然语法支持通过“对象.静态变量”或“对象.静态常量”的方式进行调用,但不建议这样做; ● 对于静态成员,一般都是要通过“类名.静态成员”的方式调用,否则在编译时会有“静态属性应该通过静态方式来访问”的提示;
好啦这个问题到这里就给大家总结完毕啦,大家一定要认真学习哦!
