今天在单位弄一个Java错误记录参数的项目,由于不能把参数直接传递到方法里面,调用后只是按值传递,引用也不会改变。所以需要借助实例来改变值。发现自己对于Java变量的基础不够扎实,就去网上查查资料做一下知识补录。
下面是正文:
1.静态变量 也叫类变量,随着类的加载而分配在存储空间,存储在方法区,不用创建什么对象就可以调用,并且可以被所有的实例和类调用,有点像全局变量那种。可以直接通过类名.变量名来访问。例如Test.i。会默认初始化。
2.成员变量 也叫实例变量或非静态变量,这个应该用得最多,就是实例化的时候就会生成,实例化结束的时候就会销毁,成员变量在堆内存里面,一般只能被对象调用。堆内存的变量都会进行默认初始化。
3.局部变量 形参、方法内定义的变量、代码块中定义的变量。按照我的理解就是for、while里面的代码一部分生成的临时变量,存放于栈内存,没有进行默认初始化,类似for(int i = 0; i <10; i++)。
那么问题来了,
一个类中的静态变量,是否能被其他类调用并且进行值的改变。我们来试验一下。
这张图解决了静态变量的这个问题:
首先Test和Test1是test包下的不同类,
经过第二阶段实验证明,相同类下可以调用并改变静态变量,
而且第三阶段证明 相同包 不同类 的Test1可以改变Test类下的static静态变量。
那么不同包的情况呢,我们再来看看下面这个截图。
需要把Test类下的static milk写成public公共类型,执行结果就跟相同包下的结果是一样的。(顺便复习一下public类型)
建议在全部符合下列条件的情况下才使用静态变量:
(1)变量所包含的对象体积较大,占用内存较多
(2)变量所包含的对象生命周期较长
(3)变量所包含的对象数据稳定
(4)该类的实例有对该变量包含对象的共享需求
总结:static静态变量可以被同包不同类下的调用改变,相当于全局变量,但是要被不同包下的类调用需要声明为public类型。
由此可以看出static静态变量在类加载的时候只加载一次。
参考以下:
Java基础——静态变量、成员变量、局部变量