局部内部类final文章1

内部类访问局部变量的时候,为什么变量必须加上final修饰

这里的局部变量就是在类方法中的变量,能访问方法中变量的类当然也是局部内部类了。 我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的。例如下面的代码:

class Outer{
public static void main(String[] args){
Outer out = new Outer();
Object obj = out.method();
}

Object method(){
int locvar = 1;
class Inner{
void displayLocvar(){
System.out.println("locvar = " + locvar);
}
}
Object in = new Inner();
return in;
}
}

当out.method()方法执行结束后,局部变量 locvar 就消失了,但是在method()方法中 obj in = new Inner() 产生的 in 对象还存在引用obj,这样对象就访问了一个不存在的变量,是不允许的。这种矛盾是由局部内部类可以访问局部变量但是局部内部类对象和局部变量的生命周期不同而引起的。

局部内部类访问局部变量的机制
在java中,类是封装的,内部类也不例外。我们知道,非静态内部类能够访问外部类成员是因为它持有外部类对象的引用 Outer.this, 就像子类对像能够访问父类成员是持有父类对象引用super一样。局部内部类也和一般内部类一样,只持有了Outer.this,能够访问外部类成员,但是它又是如何访问到局部变量的呢?

实际上java是将局部变量作为参数传给了局部内部类的构造函数,而将其作为内部类的成员属性封装在了类中。我们看到的内部类访问局部变量实际上只是访问了自己的成员属性而已,这和类的封装性是一致的。那么上面的代码实际上是这样:

Object method(){
int locvar = 1;
class Inner{
private int obj;
public Inner(int obj){
this.obj = obj;
}
void displayLocvar(){
System.out.println("locvar = " + locvar);
}
}
Object in = new Inner(locvar); //将locvar作为参数传给构造,以初始话成员
return in;
}
那么问题又来了,我们写代码的目的是在内部类中直接控制局部变量和引用,但是java这么整我们就不高兴了,我在内部类中整半天想着是在操作外部变量,结果你给整个副本给我,我搞半天丫是整我自己的东西啊?要是java不这么整吧,由破坏了封装性--------你个局部内部类牛啊,啥都没有还能看局部变量呢。这不是java风格,肯定不能这么干。这咋整呢? 想想,类的封装性咱们一定是要遵守的,不能破坏大局啊。但又要保证两个东西是一模一样的,包括对象和普通变量,那就使用final嘛,当传递普通变量的之前我把它变成一个常量给你,当传递引用对象的时候加上final就声明了这个引用就只能指着这一个对象了。这样就保证了内外统一。

时间: 2024-10-10 08:46:48

局部内部类final文章1的相关文章

局部内部类final文章2

为什么匿名内部类和局部内部类只能访问final变量 为什么匿名内部类参数必须为final类型1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的 2) 为什么Java中要加上一条限制:只能访问final型的局部变量? 3) JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理论上这是很自然的要求),但是:编译

Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量

为什么匿名内部类参数必须为final类型: 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的,是很自然的. 2) 为什么JAVA中要加上一条限制:只能访问final型的局部变量? JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理论上这是很自然的要求),但是:编译技术是无法实现的或代价极高. 至于为什么只能是fi

Java学习笔记23---内部类之局部内部类只能访问final的局部变量

局部内部类是定义在方法体或代码块中的类,在笔记19中已有过简单介绍. 今天要讨论的是局部内部类为什么只能访问为常量的局部变量. 作者: 博客园--蝉蝉 请尊重作者劳动成果,转载请在标题注明"转载"字样,并标明原文链接: http://www.cnblogs.com/chanchan/p/8402411.html 参考资料: http://www.cnblogs.com/dolphin0520/p/3811445.html 1.首先来了解一下局部内部类是如何访问局部变量的 Person类

java笔记--局部内部类认识与理解

java内部类 内部类应用最多的场景是在编写GUI程序时,将大量的事件监听处理放在了内部类中进行 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3885340.html "谢谢-- 局部内部类: 1.在java中将类定义在方法的内部,成为局部内部类. 2.此类不能使用public.private修饰, 3.其作用域被限定在声明此类的方法中. 4.和其他内部类相比,它具有可以访问方法参数的优点. 5.被局部内部类使用的方法参数必须是

Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部

Java学习(十六)、成员内部类,静态内部类,匿名内部类,局部内部类

定义:将一个类定义在另一个类的内部.内部的类称为内部类; public class Outer{ class inner{ //省略 } } 特点: ①   内部类可以很好的实现隐藏,可以使用protected,private修饰符; ②   内部类可以直接访问外部类的所有成员,包括私有成员; ③   外部类不能直接访问内部类的成员,必须首先要建立内部类的对象才能访问; ④   内部类可以解决一些问题,比如间接的去实现多继承.可以避免修改接口而实现同一个类中两种同名方法的调用; 成员内部类及应用

19、局部内部类和匿名内部类

package com.lei.duixiang; /** * 局部内部类 * 1.如果需要在方法中使用局部变量,该局部变量需要被设置为 final 类型 * 2.换句话说,在方法中定义的内部类只能访问方法中 final 类型的局部变量 * 这是因为在方法中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期 * 由于该局部变量被设置为final,所以不能在内部类中改变局部变量的值 * @author Administrator * * 匿名内部类 OutClass4 */ inte

java9-8 局部内部类

1. 局部内部类 A:可以直接访问外部类的成员 B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能 面试题: 局部内部类访问局部变量的注意事项? A:局部内部类访问局部变量必须用final修饰 B:为什么呢? 局部变量是随着方法的调用而调用,随着调用完毕而消失. 而堆内存的内容并不会立即消失.所以,我们加final修饰. 加入final修饰后,这个变量就成了常量.既然是常量.你消失了. 我在内存中存储的是数据20,所以,我还是有数据在使用. 1 class Oute

Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类

说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811445.html 一