[JAVA] Java 中变量与常量的生命周期

今天在复习视频的时候看到了内部类中,关于定义在局部的内部类要访问局部变量时,需要该变量被final所修饰,然后老师演示了一个现象。


创建了一个内部内对象,并为其常量赋值,然后又一次对常量进行了赋值,两次赋值都成功了。有同学提出疑惑,于是老师说到了栈内存以及内部变量和常量的生命周期问题。


之前也提到过很多次关于这个“生命周期”的问题,于是就想到了写篇东西整理一下。


首先解释一下变量和常量的概念


变量是内存中开辟的一块存储区域,用于记录和存储不断变化的数据的值。

变量有固定的定义格式,当我们在进行运算和操作时,发现有部分数据会不断发生变化,而我们又需要重复操作这部分数据时,就可以定义一个变量将其进行记录。


常量也是一块存储区域,在定义常量时会进行一次赋值,之后一直到常量的生命周期结束,该常量的值都不会被改变及被第二次赋值。


然后是关于生命周期


所谓生命周期,也有说法叫做作用域。是指常量和变量都有自己固定的生效范围,一旦在这个范围之外将失去效用。生命周期一般以区间作为界限,即{}


另外的,关于不同类型的常量或变量在内存中都有自己的存储空间,在这里涉及到的三片内存空间也进行一下简单的说明:


栈内存:

这片内存最大的特点是内部数据的生命周期都很短,数据在生命周期结束之后会自动释放。

主要用于存放局部变量,局部常量。


堆内存:

数组和对象,以及引用指向的实体都被存放在这片内存当中。相对栈内存而言,这片内存内的数据的生命周期就由调用者进行指定。除非内部数据不再被栈引用指向了,否则会一直存在于这片内存空间当中。


而当内部实体不再被指向之后,实体所占用的内存空间也不会被立即释放,而是在不定时的时间范围内被Java自带的垃圾回收机制所回收。


成员变量,实例变量的特点:



成员变量:


作用范围:整个类;

初始化值:有默认初始化值;

实例变量:


作用范围:由new创建的实体内部;

初始化值:有默认初始化值;


局部变量:


作用范围:函数或语句的作用范围内部;

初始化值:没有初始化值,必须手动指定初始化值;


类变量:


这是一个区别于上两者的特殊变量,存放区域也是区别于栈内存与堆内存的第三片存储区域:方法区。

当一个变量被成员修饰符static修饰之后,即成为类变量。

类变量的生命周期最最长,随着类的创建而创建,在实体建立之前就已经存在。

可以直接通过类名调用。


作用范围:整个类;

初始化值:有默认初始化值;



常量和final


最后来看引发我想要写这篇日志的主要原因:


来看这段代码:

class Outer
{
	int x = 3;

	void method(final int a)
	{
		final int y = 4;
		class Inner
		{
			void function()
			{
				System.out.println(y);
			}
		}
	
		new Inner().function();
		
	}
}


class  InnerClassDemo3
{
	public static void main(String[] args) 
	{
		Outer out = new Outer();
		out.method(7);//这句可以编译通过;
		out.method(8);//这句也可以编译通过;
	}

}

最开始造成困扰的原因是,大家都以为当yfinal修饰之后,会成为一个常量,不能进行第二次赋值。


但实际上,y的生命周期在这段语句结束之后就已经结束了。


void method(final int a)
	{
		final int y = 4;
		class Inner
		{
			void function()
			{
				System.out.println(y);
			}
		}
	
		new Inner().function();
		
	}


当第二次调用method方法时,这段代码会第二次运行,所以y可以被再次赋值。


但如果在method方法的作用域里写上y++;这样的语句就会编译失败。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值