`
mypyg
  • 浏览: 549624 次
  • 性别: 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修饰的局部变量的合理解释.doc

    Java 中局部内部类可以访问它所在方法中定义的 final 修饰的局部变量的合理解释 在 Java 中,局部内部类可以访问它所在方法中定义的 final 修饰的局部变量,这是一个非常重要的知识点。这是因为 JVM 在编译时会将 ...

    Java成员变量类变量局部变量的区别共5页.pdf.zip

    Java编程语言中有三种主要的变量类型:成员变量(也称为实例变量)、类变量(也称为静态变量)和局部变量。理解这些变量之间的区别是掌握Java基础的重要部分,这对于编写高效、可维护的代码至关重要。 成员变量是...

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

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

    Java中的final关键字

    这是因为匿名内部类可能在外部方法执行完成后仍然存在,所以需要确保引用的变量不会在内部类的生命周期内改变。 5. **final参数** - `final`修饰的形参表示该参数的值在方法体内不能改变,增强了代码的可读性和...

    局部内部类和匿名内部类使用局部变量为什么要final1

    这种情况下的阅读和运行结果不一致,为了避免这种混淆,Java规定局部变量必须是final的,确保一旦赋值就不能更改,从而保证内部类的成员变量(实际上是局部变量的副本)与原始变量保持一致。 4. **final关键字的...

    Java中final的用法.doc

    如果这个变量不是`final`的,编译器将无法保证局部变量在匿名类的生命周期内保持不变。 7. **不可覆盖的方法**: 当`final`修饰方法时,表明这个方法不能在子类中被重写。这有助于维护类的封装性和设计意图。 8. ...

    java 常量与变量

    在Java编程语言中,常量和变量是两个基础且重要的概念。它们是程序中存储数据的容器,理解它们的性质和用法对于编写高效的代码至关...在实际编程中,还需根据需求选择合适的数据类型,并注意变量的作用域和生命周期。

    Java面向对象教程设计.docx

    Java 面向对象教程设计的基本概念和要点包括变量的生命周期和作用域、静态变量、实例变量、局部变量、参数传递、final 变量、Object 类和访问控制符等。掌握这些概念和要点对于学习 Java 面向对象编程非常重要。

    浅析Java中的final关键字Java开发Java经验技

    此外,`final`关键字还与匿名内部类和局部变量紧密相关。在创建匿名内部类时,如果需要引用外部类的非静态变量,这个变量必须是`final`的。这是因为内部类可能在外部类的实例生命周期之外存在,因此需要保证变量的值...

    第4章_JAVA之常量与变量.ppt

    在示例 4-1 中,我们可以看到如何使用常量作为类的成员变量,这样可以确保该值在整个类的生命周期中保持不变。 4.2 变量 变量则是存储数据的容器,它的值可以在程序运行过程中改变。声明变量的基本语法如下: ```...

    Java中final变量使用总结

    当在匿名内部类中引用外部局部变量时,该变量必须是`final`或实际上等效于`final`,因为内部类可能在外部作用域之后被实例化,因此需要一个不可变的引用。 总的来说,`final`关键字在Java中提供了一种强大的工具,...

    final类,方法,变量

    同样,在Java 8及更高版本中,`final`局部变量可以作为lambda表达式的捕获变量,保证了lambda表达式只能读取而不能修改这些变量。 在工具方面,IDEs如Eclipse和IntelliJ IDEA提供了很好的支持来使用`final`关键字。...

    Java中变量的使用规则共2页.pdf.zip

    5. **变量的生命周期**:局部变量仅在声明它的代码块执行时存在,一旦执行结束,变量就会被销毁。成员变量随着对象的创建而存在,随着对象的销毁而消失。静态变量则随着类的加载而存在,直到程序结束。 6. **变量的...

    第02章 Java编程基础 01 变量与标识符

    在Java中,变量有其特定的生命周期,从声明到初始化,再到使用和最后的销毁。变量的声明需要指定类型,例如int、double、String等,这决定了变量可以存储的数据种类。变量名应遵循一定的命名规则:只能包含字母、...

    Java 变量类型总结.docx

    Java编程语言中有三种类型的变量:类变量(静态变量)、实例变量和局部变量,每种都有其特定的用途和生命周期。 1、类变量(静态变量) 类变量,也被称为静态变量,使用`static`关键字声明,存在于类的静态存储区。...

    Java中变量的存储位置

    这些变量在整个程序的生命周期内只存在一份副本,被所有的实例共享。 5. **常量池**:用来存放字符串常量和基本类型常量(通常由`public static final`修饰)。常量池中的每个字符串对象都是唯一的,即如果有多个...

    java变量的五种方式t共2页.pdf.zip

    在Java中,局部变量必须先初始化后才能使用,而成员变量(包括实例变量和静态变量)在类加载时自动初始化为默认值,如零、空引用等。使用`static`关键字初始化静态变量,使用构造函数初始化实例变量。 7. **变量的...

    Java中static、this、super、final用法.doc

    总结起来,`static`、`this`、`super`和`final`是Java中控制对象生命周期、引用当前对象、访问父类成员以及确保数据不变性的重要工具。理解和熟练使用这些关键字对于编写高质量的Java代码至关重要。在实际编程中,应...

    Java 变量类型的知识分享

    局部变量必须先声明再使用,且未初始化的局部变量不能被使用。 - 成员变量:定义在类或接口内的变量,包括实例变量(属于类的每个实例)和静态变量(属于类本身,所有实例共享)。成员变量可以有默认初始值。 5. ...

    Java 变量类型总结.pdf

    Java 变量是编程语言中存储数据的基本单元,它分为三种主要类型:类变量(静态变量)、实例变量和局部变量。每种类型的变量在内存中存储的位置、生命周期和访问方式都有所不同,以下是对这三种变量类型的详细说明。 ...

Global site tag (gtag.js) - Google Analytics