Java程序的变量大体可分为成员变量和局部变量。

一、局部变量

其中局部变量可分为如下3类。
形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。
方法内的局部变量:在方法内定义的局部变量,必须在方法内对其进行显示初始化。这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡。
代码块的局部变量:在代码块内定义的局部变量,必须在代码块内对其进行显式初始化,这种类型的局部变量从初始化完成后开始生效,随代码的结束而消亡。

局部变量的作用时间很短暂,它们都被存储在方法的栈内存中。类体内定义的变量被称为成员变量(英文是Field)。如果定义该成员变量时没有使用static修饰,该成员变量又被称为非静态变量或实例变量;如果使用了static修饰,则该成员变量又可被称为静态变量或类变量

对于static关键字而言,从词义上来看,它是“静态”的意思。但从Java程序的角度来看,static的作用就是将实例成员变为类成员。static只能修饰在类里定义的成员部分,包括成员变量、方法、内部类、初始化块、内部枚举类。如果没有使用static修饰这里类里的成员,这里成员属于该类的实例;如果使用了static修饰,这些成员就属于类本身。从这个意义上看,static只能修饰类里的成员,不能修饰外部类,不能修改局部变量、局部内部类。

二、成员变量

实例变量和类变量的属性

使用static修饰的成员变量是类变量,属于该类本身;没有使用static修饰的成员变量是实例变量,属于该类的实例。在同一个JVM内,每个类只对应一个Class对象,但每个类可以创建多个Java对象。

由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间;但对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间。也就是说,程序中有几个实例,实例变量就需要几块内存空间。

实例变量的初始化时机
对于实例变量而言,它属于Java对象本身,每次程序创建Java对象时都需要为实例变量分配内存空间,并执行初始化。
从程序运行的角度来看,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。
从语法角度来看,程序可以在3个地方对实例变量执行初始化:

  1. 定义实例变量时指定初始值
  2. 非静态初始化块中对实例变量指定初始值
  3. 构造器中对实例变量指定初始值
    其中第1、2种方式(定义时指定的初始值和非静态初始化块中指定的初始值)比第3种方式(构造器中指定初始值)更早执行,但第1、2中方式的执行顺序与他们在源程序中的排列顺序相同。

类变量的初始化时机
实例变量属于Java类本身,只有当程序初始化该Java类时才会为该类的类变量分配内存空间,并执行初始化。
从程序运行的角度来看,每JVM对一个Java类只初始化一次,因此Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。
从语法角度来看,程序可以在2个地方对类变量执行初始化:

  1. 定义类变量时指定初始值
  2. 静态初始化块中对类变量指定初始值。
    这两种方式的执行顺序与它们在源程序中的排列顺序相同。

最后附上图片一张
JAVA中 类变量,局部变量和实例变量详解 - 图1

  • 1.类变量也叫静态变量,也就是在变量前加了static 的变量
  • 2.实例变量也叫对象变量,即没加static 的变量;区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象