Java变量分类

局部变量

局部变量的存在的时间很短,它们都被存储在方法的栈内存中,随着方法的结束而消亡

  • 形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。

pubilc static viod read(File file)

  • 方法内的局部变量:在方法内定义的局部变量,必须在方法内对其进行显式初始化。这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡。

pubilc static viod read(File file){
FileInputStream in = new FileInputSteam(file);
}

  • 代码块内的局部变量:在代码块内定义的局部变量,必须在代码块内对其进行显式初始化。这种类型的局部变量从初始化完成后开始生效,随代码块的结束而消亡。

{
String path = “D:/JavaTest”;
}

成员变量

类中定义的变量叫做成员变量
如果该成员变量没有被static修饰则该成员变量又被称为非静态变量或者实例变量
如果该成员变量被static修饰,则该成员变量又可被称为静态变量或者类变量

static关键字

static只能修饰在类中定义的成员部分:成员变量,方法,内部类,初始化块,内部枚举类.如果没有static修饰类中的成员,则这些成员属于该类的实例,如果用static修饰这些成员,则这些成员属于类本身
static只能修饰类中的成员,不能修饰外部类,局部变脸,局部内部类

实例变量和类变量的属性

在同一个JVM内,每个类只对应一个Class对象,但每个类可以创建多个Java对象。
image.pngimage.pngimage.pngimage.png

实例变量的初始化时机

从语法角度来看,程序可以在3个地方对实例变量执行初始化:

  • 定义实例变量时指定初始值;
  • 非静态初始化块中对实例变量指定初始值;
  • 构造器中对实例变量指定初始值。

非静态代码块为实例变量指定初始值和定义实例变量指定的初始值的地是相等的,跟两者在程序中的位置有关
image.png
image.pngimage.png

类变量的初始化时机

从语法角度来看,程序可以在2个地方对类变量执行初始化:

  • 定义类变量时指定初始值;
  • 静态初始化块中对类变量指定初始值。

JVM先为所有类变量分配内存空间,再按源代码中的排列顺序执行静态初始化块中所指定的初始值和定义类变量时所指定的初始值
初始化第一阶段,系统先为INSTANCE、initPrice两个类变量分配内存空间,此时INSTANCE、initPrice的值为默认值null和0.0。接着初始化进入第二个阶段,程序按顺序依次为INSTANCE、initPrice进行赋值。对INSTANCE赋值时要调用Price(2.8),创建Price实例,此时立即执行程序中粗体字代码为currentPrice进行赋值,此时initPrice类变量的值为0,因此赋值的结果是currentPrice等于−2.8。接着,程序再次将initPrice赋为20,但此时对INSTANCE的currentPrice实例变量已经不起作用了。
image.png