`
mypyg
  • 浏览: 545546 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
从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在本次调用中不能再次指向别的对象,并代表这个对象始终存在,整个程序生命周期中只初始化一次。

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

同样在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,才是只初始化一次。


0
0
分享到:
评论

相关推荐

    java为什么匿名内部类的参数引用时final?final局部变量的生命周期

    在知乎上看到了一篇帖子 在这个问题下面大家已经吵得不可开交了,看了很多篇文章,被误导进了很多的坑,发现只有下面两篇文章是写的最好的,解释的很清楚,我把两篇文章简单的总结了一下: ...1.问题的引出 ...

    corejava培训文档

    6.3. 成员变量和局部变量 6.4. 成员方法 6.5. This关键字 6.6. 访问控制符 6.7. 构造方法 6.8. 数据和方法的隐藏―――封装 6.9. 方法的重载 7. 六 高级语言特性 7.1. 封装 (encapsulation) 7.2. 继承 ...

    java面试宝典

    232、说出Servlet的生命周期,并说出Servlet和CGI的区别。 55 233、说出在JSP页面里是怎么分页的? 55 234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、...

    java 面试题 总结

    6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器...

    21天学通Java-由浅入深

    240 12.2.1 创建局部内部类 240 12.2.2 在局部内部类中访问外部类成员变量 240 12.2.3 在局部内部类中访问外部类的局部变量 241 12.2.4 静态方法中的局部内部类 243 12.3 静态内部类 244 12.3.1 创建静态内部类 244 ...

    疯狂JAVA讲义

    5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和import 135 5.4.4 Java的常用包 140 5.5 深入...

    java学习笔记 初学者必读

    6.3. 成员变量和局部变量 6-12 6.4. 成员方法 6-12 6.5. This关键字 6-13 6.6. 访问控制符 6-13 6.7. 构造方法 6-13 6.8. 数据和方法的隐藏―――封装 6-14 6.9. 方法的重载 6-15 7. 六•高级语言特性 7-15 7.1. ...

    java基础案例与开发详解案例源码全

    12.2 线程的生命周期309 12.2.1 线程的状态及转换310 12.2.2 线程睡眠311 12.2.3 线程让步313 12.2.4 线程的加入313 12.3 线程的调度和优先级314 12.4 线程的同步315 12.4.1 线程同步的方法317 12.4.2 对象锁319 ...

    java编程基础,应用与实例

    5.4 局部变量和成员变量 67 5.5 this引用 68 5.6 静态变量与静态方法 70 5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 ...

    corejavaNoteBook

    6.3. 成员变量和局部变量 6-12 6.4. 成员方法 6-12 6.5. This关键字 6-13 6.6. 访问控制符 6-13 6.7. 构造方法 6-13 6.8. 数据和方法的隐藏―――封装 6-14 6.9. 方法的重载 6-15 7. 六•高级语言特性 7-15 7.1. ...

    千方百计笔试题大全

    232、说出Servlet的生命周期,并说出Servlet和CGI的区别。 55 233、说出在JSP页面里是怎么分页的? 55 234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、...

Global site tag (gtag.js) - Google Analytics