文章图片
文章图片
前言在 Java语言中 根据定义变量位置的不同可以将变量分成两大类:
- 成员变量
- 局部变量
成员变量成员变量指的是在类里定义的变量.
局部变量指的是在方法里定义的变量.
下面我给出Java程序中的变量划分图:
成员变量被分为类变量和实例变量两种.
定义成员变量时没有 static 修饰符的就是实例变量.
有static修饰符的就是类变量.
其中 类变量从该类的准备阶段起开始存在.
直到系统完全销毁这个类类变量的作用域与这个类的生存范围相同.
而实例变量则从该类的实例被创建起开始存在直到系统完全销毁这个实例.
实例变量的作用域与对应实例的生存范围相同.
小知识: 一个类在使用之前需要经过 类加载 / 类验证 / 类准备 / 类解析 / 类初始化 等几个阶段.
正是基于以上原因 可以把类变量和实例变量统称为成员变量.
其中 类变量可以理解为 类成员变量 它作为类本身的一个成员 与类本身共存亡.
实例变量则可以理解为 实例成员变量 它作为实例的一个成员 与实例共存亡.
只要类存在 程序就可以访问该类的类变量.
在程序中通过如下语法访问:
类.类变量
只要实例存在 程序就可以访问该实例的实例变量.
在程序中通过如下语法访问:
实例.实例变量
当然 类变量也可以让该类的实例来访问.
通过实例访问类变量的语法如下:
实例.类变量
但由于这个实例并不拥有这个类变量.
因此它访问的并不是这个实例的变量依然是访问它对应类的类变量.
也就是说 如果通过一个实例修改了类变量的值 由于这个类变量并不属于它.
而是属于它对应的类. 因此 修改的依然是类的类变量.
与通过该类来修改类变量的结果完全相同.
这会导致该类的其它实例来访问这个类变量时也获得这个被修改过的值.
下面我写个程序 定义了一个 Person 类 在这个 Person 类中定义两个成员变量.
一个类变量: eyeNum
一个实例变量: name
程序通过 PersonTest 类来创建 Person 实例.
并分别通过 Person 类 和 Person 实例来访问实例变量和类变量.
class Person{ //定义一个类变量
public static int eyeNum; //定义一个实例变量
public String name;
public class PersonTest{ public static void main(String[
args)
{ //第一次主动使用 Person 类 该类自动初始化 则 eyeNum 变量开始起作用 输出 0
System.out.println(\"Person 的 eyeNum 类变量的值:\" + Person.eyeNum); //创建 Person 对象
Person p = new Person(); //通过 Person 对象的引用 p 来访问 Person 对象的 name 实例变量
//并通过实例访问 eyeNum 类变量
System.out.println(\"p 对象的 name 变量的值是:\" + p.name + \"p 对象的 eyeNum 变量的值是:\" + p.eyeNum); //直接为 name 实例变量赋值
p.name = \"孙悟空\"; //通过 p 访问 eyeNum 类变量 依然是访问 Person 的 eyeNum 类变量
- Java|JS加密技术:平展控制流
- 阿里巴巴|育碧也希望被微软收购?育碧CEO表示对于收购待价而沽!
- 比利时|每周工作四天薪酬不变,比利时通过新规定
- 联发科|骁龙8最大对手来了!联发科徐敬全:天玑9000性能极致还很冷静
- 一加10 Pro、小米12 Pro游戏对比:同是骁龙8差距有点大
- r5-5600x|12 代酷睿 i5-12400F 对阵 AMD R5-5600X:夺回中端霸主的桂冠
- realme|iQOO Neo5S和realme GT探索版对比:哪一款更香?
- 滴滴出行|人民日报说得很对!滴滴突然官宣,柳青不想看到的情况发生了
- 爱因斯坦又对了!叶军团队证实相隔1毫米时间差一千亿亿分之一
- 叶军|爱因斯坦又对了!叶军团队证实相隔1毫米时间差一千亿亿分之一