今天看了一个帖子,有一点感受,总结一下
http://topic.csdn.net/u/20080420/16/29aff093-650c-418f-a1a5-7353ef30bdc0.html
1)所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,是天经地义的。那么为什么要加上一个final呢?
2)原因是:编译程序实现上的困难,难在何处:内部类对象的生命周期会超过局部变量的生命期。为什么?表现在:局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建(诞生),当方法调用结束时(执行完毕),退栈,这些局部变量全部死亡。而:内部类对象生命期,与其它类一样,当创建一个该局部类对象后,只有没有其它人再引用它时,它才能死亡。完全可能:一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。
3)退一万步:局部类的对象生命期会超过局部变量又怎样?问题的真正核心是:如果:局部内部类的对象访问同一个方法中的局部变量,是天经地义的,那么:只要局部内部类对象还活着,则:栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?),这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。而:正是这一点是不可能做到的
4)但是从理论上:局部内部类的对象访问同一个方法中的局部变量,是天经地义的。所以:经过努力,达到一个折中结果:即:局部内部类的对象可以访问同一个方法中的局部变量,只要这个变量被定义为final.那么:为什么定义为final变可以呢?定义为final后,编译程序就好实现了:具体实现方法是:将所有的局部内部类对象要访问的final型局部变量,变成该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变,因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。
归纳上述回答的真正核心是:局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。因此,正是在这个意义上,final型局部变量的生命期,超过其方法的一次调用。严格来说,方法调用结束,所有的局部变量(含final)全死亡了。但:局部内部类对象中有final型局部变量的拷贝。
其他:
不管对象是不是final,他的生命周期都是 new开始,垃圾回收结束。
不管变量是不是final,他的生命周期都在于{}中。
类对象(class对象)与其它对象不同,类对象的生命周期 开始于类被加到内存中那一刻,结束于垃圾回收。
类变量(static)与类对象的生命周期相同。
分享到:
相关推荐
1. **生命周期的不匹配**:当一个匿名内部类或局部内部类被创建时,它可以作为外部方法的返回值,存在于方法的外部。如果这个内部类可以访问非final的局部变量,那么在方法结束后,这些变量应该已经失效,但内部类...
这使得局部内部类可以访问它所在范围内的所有变量,包括局部变量,但这些变量必须是final的。局部内部类主要用来实现某个特定功能,其生命周期与包含它的方法或块相同。 4. **明明内部类**: "明明内部类"可能是指...
4. **this关键字**: 在方法中,使用`this`关键字可以引用当前对象的成员变量,以区分方法参数或其他局部变量。 **局部变量** 局部变量是在方法、构造器或初始化块中声明的变量。它们只在声明它们的代码块内有效,...
- **行为:** 当在一个函数或块中定义了一个局部变量,并且它的名字与全局变量相同,那么在该函数或块的范围内,对该变量的引用将指向局部变量而不是全局变量。这意味着局部变量“隐藏”了全局变量。 - **解除隐藏:...
这类变量可以在任何函数内部被引用或修改,但需要注意的是,全局变量容易引发程序中的副作用,因此在实际开发中应尽量避免过度使用。 **局部变量**则是在某个函数或代码块内部声明的变量,其作用域仅限于该函数或...
局部变量是在方法内部或者某个代码块中声明的变量。它们的作用域仅限于声明它们的方法或代码块。这意味着一旦执行流离开该方法或代码块,这些变量就会被销毁。 ##### 特点: 1. **存储空间**:局部变量的存储空间是...
内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...
例如,如果局部变量引用了非线程安全的对象(如全局变量、静态变量或者共享资源),或者通过某种方式(如闭包)使得局部变量的生命周期超出了其定义的代码块,那么就可能出现线程安全问题。因此,即使变量本身是局部...
通过以上的介绍,我们可以更深入地理解局部变量和全局变量的概念及其使用方法,这对于编写高效、安全的程序非常重要。正确地使用局部变量和全局变量能够帮助我们更好地管理程序的状态和提高代码的可读性和可维护性。
在C++编程语言中,全局变量是在程序的任何作用域之外声明的变量,可以在程序的多个函数或类中被...在设计C++程序时,应优先考虑使用局部变量、类成员变量以及函数参数来传递和管理数据,以提高代码的可读性和可维护性。
**局部变量(Local Variables)**:在函数或代码块内部声明的变量称为局部变量。这些变量的作用域仅限于它们被声明的函数或代码块,一旦函数执行完毕或离开代码块,这些变量就会被销毁。 **全局变量(Global Variables...
成员变量”来引用外部类的成员变量,如果在内部类中直接引用成员变量,会存在一个隐藏的“this.”,即如果内部类和外部类有同名成员变量,则内部类中的引用会指向内部类的成员变量。 根据给定的文件内容,我们看到...
当Block在函数或方法内部定义并捕获了局部变量时,如果这个Block被复制到堆上(例如赋值给一个对象属性或返回Block),那么局部变量的生命周期将被延长,直到Block不再被引用。此时,局部变量的行为类似静态变量,...
这保证了在多态环境中调用该方法时,总是执行父类中的特定实现。例如,`Object`类的`equals()`和`hashCode()`方法被声明为`final`,以确保所有类都遵循统一的比较和哈希计算规则。 然后是`final`变量。`final`变量...
由于其局部性,局部内部类可以访问方法内的所有局部变量和参数,但这些变量必须是 final 或 effectively final。局部内部类不能声明为 static,也不能被外部类访问,除非通过方法返回。 4. 匿名内部类(Anonymous ...
- 当局部变量在代码块内被局部内部类引用时,该变量必须是`final`的,因为局部变量在代码块结束时会被销毁,而局部内部类的对象可能会持续存在。 总的来说,内部类是Java提供的一种强大的工具,它增加了代码的灵活...
2. **局部内部类**: 定义在方法、构造器或块中的类被称为局部内部类。它的作用范围仅限于该方法、构造器或块。 3. **静态内部类**: 声明为static的内部类,称为静态内部类。它不持有对外部类的隐式引用,因此可以...
- **局部内部类**:是在一个方法或构造器内部定义的类,可以访问该方法或构造器内的局部变量,但这些局部变量必须声明为`final`。 - **匿名内部类**:没有名字的内部类,通常用于实现接口或继承类时简化代码,主要...
局部内部类可以访问方法的局部变量,但这些变量必须声明为final。 - 静态内部类:与普通成员内部类不同,静态内部类可以像普通类一样通过类名直接创建实例,无需外部类的实例。但它不能直接访问外部类的非静态成员...
- 局部内部类:定义在方法或者作用域块中,不能有访问权限修饰符,只能访问方法中被final修饰的局部变量。 - 匿名内部类:没有类名的局部内部类,通常用在需要创建一个对象时,且仅需使用一次的场合。 - 静态内部类...