Java中final局部变量的生命周期

本文通过实例对比Java中的final关键字与C++中的const关键字,解析二者在局部变量生命周期及对象引用上的行为差异,纠正常见的理解误区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从C转Java过来,一些基础理论不是太扎实,在使用final局部变量时出现了理解错误,今天验证了一下,记下笔记。

public class Main {

public void finalTestFunc() {
final FinalTest t = new FinalTest();
System.out.println("T:" + t.toString());
}

/**
* @param args
*/
public static void main(String[] args) {
Main m = new Main();
m.finalTestFunc();
m.finalTestFunc();
}

}


FinalTest是个空类,啥都没有,toString会转换成其地址打印出来,上面一段程序的打印:
T:FinalTest@c17164
T:FinalTest@1fb8ee3

可以看到在finalTestFunc()函数中虽然t用final修饰了,但是两次调用,每次都创建了新的对象,final只是标记了t在[b][color=red]本次调用[/color][/b]中不能再次指向别的对象,并[color=red][b]不[/b][/color]代表这个对象始终存在,整个程序生命周期中只初始化一次。

为什么会有只初始化一次的错误理解呢?
其实刚开始使用Java的时候,理解是正确的,认为每次都初始化。
但是后来使用内部类,内部类如果访问外部类的变量,这个变量就要加final修饰,因为对Java掌握不到位,此时错误的认为final将变量的生命周期改为了整个程序生命周期,而实际上此处加final是保证变量值一致性,详情可见:
[url]http://developer.51cto.com/art/200906/128214.htm[/url]
[url]http://topic.youkuaiyun.com/u/20090217/13/f1727a3c-766d-49c2-b68c-d3b5e154cb6e.html[/url]

同样在C++中的const也是这个现象,const局部变量的生命周期仍然是局部的,只有加上static才是全局的。
#include <iostream>
using namespace std;

class A {
private:
int v;

public:
A() {
v = 0;
}

void out() const {
cout << "A=" << this << endl;
}
};

class B {
public:
B() {
}

void constTest() {
const A* a = new A();
a->out();
}
};

int main(int,char**) {
B* b = new B();
b->constTest();
b->constTest();
}

这段程序输出:
A=0x89a8018
A=0x89a8028

即每次函数调用都创建了新的对象,只有加上在const后加上static,才是只初始化一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值