Java之实例变量和类变量

    

            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静态初始化块中对类变量指定初始值
这两种方式的执行顺序与它们在源程序中排列顺序相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值