Java|Java面向对象之各种变量详解

Java|Java面向对象之各种变量详解

文章图片

Java|Java面向对象之各种变量详解

文章图片

Java|Java面向对象之各种变量详解

前言在 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 类变量