您的位置:首页 > 编程语言 > Java开发

Java之实例变量和类变量

2016-05-23 21:46 387 查看
  
 

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

局部变量可以分为三类:

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

               (方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成)

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

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

       
局部变量的作用时间很短暂,都被存储在栈内存中。

       
类体内的变量被称为成员变量,定义该成员变量没有使用static的话,该成员变量被称为非静态变量或实例变量;如果使用了static修饰的话,该成员变量又可被称为静态变量或类变量。

   
(static只能修饰在类里定义的成员部分,包括成员变量、方法、内部类、初始化块、内部枚举类。如果没有使用static修饰这些类里的成员,这里成员属于该类的实例。如果使用了static修饰,这些成员就属于类本身。static只能修饰类里的成员,不能修饰外部类,不能修饰局部变量,局部内部类)

类变量初始化时机总是处于实例变量的初始化时机之前。

实例变量总是可以引用类变量。

一 实例变量和类变量的属性

使用static修饰的成员变量是类变量,属于该类本身;

没有使用static修饰的成员变量是实例变量,属于该类的实例。

由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间。

对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间。

(每个类初始化完成后,系统都会为该类创建一个对应的Class实例,程序可以通过反射来获取某个类所对应的Class实例)

二实例变量的初始化时机

对于实例变量而言,它属于Java对象本身,每次程序创建Java对象时都需要为实例变量分配内存空间,并执行初始化。

从程序运行角度来看,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。

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

1 定义实例变量时指定初始值

2 非静态初始化块中对实例变量指定初始值

3 构造器中对实例变量指定初始值

其中第1、2种方式(定义时指定的初始值和非静态初始化块中指定的初始值)比第3种方式(构造器中指定的初始值)更早执行。

1、2种方式的执行顺序与她们在源程序中的排列顺序相同。

定义实例变量时指定的初始值、初始化块中为实例变量指定的初始值、构造器中为实例变量指定的初始值,三者的作用完全类似,都用于对实例变量指定初始值。

经过编译器处理之后,它们对应的赋值语句都被合并到构造器中。在合并过程中,定义变量语句转换得到的赋值语句、初始化块里的语句转换得到的赋值语句,总是位于构造器的所有语句之前;合并后,两种赋值语句的顺序保持它们在源代码中顺序。

类变量的初始化时机

   
实例变量属于Java类本身,只有当程序初始化该Java类时才会为该类的类变量分配内存空间,并执行初始化。

从程序运行的角度来看,每JVM 对一个Java类只初始化一次,因为Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。

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

1定义类变量时指定初始值

2静态初始化块中对类变量指定初始值

这两种方式的执行顺序与它们在源程序中排列顺序相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java