定义在方法中的内部类能否访问该方法的局部变量?

定义在方法中的内部类当然是可以访问方法中的局部变量的,访问的方法就是在局部变量上添加final关键字

(1)内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的。
(2)内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。这是因为局部变量的生命周期原因。

class Outer{
    private int a;
    public class Inner{
        private int a;
        public void method(int a){
            a++;    //局部变量
            this.a++;    //Inner类变量
            Outer.this.a++;    //Outer类变量
        }
    }
}

一般做法是在Outer中写一个返回Inner类对象的方法
public Inner getInner(){
    return new Inner();
}

在其他类中使用内部类:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
或者 Outer.Inner inner = outer.getInner();

static内部类的使用:
Outer.Inner inner = new Outer.Inner();

(1).所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,却必须要加上一个final。
(2).原因是编译程序实现上的困难:内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才能死亡。所以完全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。
(3).局部内部类的对象访问同一个方法中的局部变量,那么这就要求只要局部内部类对象还活着,那么栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?)。这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。
(4).解决方法:局部内部类的对象可以访问同一个方法中被定义为final的局部变量。定义为final后,编译程序的实现方法:将所有的局部内部类对象要访问的final型局部变量,都拷贝成为该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变,因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。(这一点我有些怀疑)
(5).归纳总结:局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。因此,正是在这个意义上,final型局部变量的生命期,超过其方法的一次调用。严格来说,方法调用结束,所有的局部变量(含final)全死亡了。但:局部内部类对象中有final型局部变量的拷贝。

参考:http://blog.csdn.net/zhangjg_blog/article/details/19996629

时间: 2024-10-11 05:34:03

定义在方法中的内部类能否访问该方法的局部变量?的相关文章

方法中的内部类,操作本方法中的局部变量时,局部变量应该声明为final!!

如题! public void doit(){   final int i=9;        Thread t=new Thread(new Runnable(){ @Override            public void run() {                // TODO Auto-generated method stub                i++;            }                    });

方法中的内部类能不能访问方法中的局部变量

1).内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的.(2).内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类).这是因为局部变量的生命周期原因. class Outer{    private int a;    public class Inner{        private int a;        public void method(int a){            a+

ruby中的链式访问和方法嵌套

先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScript写的,但是也放在了ruby语言里面,这个没有关系.题目内容是有一个类Calc,通过链式方法调用,可以实现加减乘除.如图给的四个例子.数字只有0-9,运算只有加减乘除,而且每个运算只有一个操作符.(可以先不看下面,自己先想一下怎么写) 首先,每一个例子都是同样的结构---类名和四个方法.拿第一个

深入理解Java中为什么内部类可以访问外部类的成员

内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, 但是依然不是很清楚.其中一个疑惑就是为什么内部类对象可以访问外部类对象中的成员(包括成员变量和成员方法)? 早就想对内部类这个特性一探究竟了,今天终于抽出时间把它研究了一下. 内部类就是定义在一个类内部的类.定义在类内部的类有两种情况:一种是被static关键字修饰的, 叫做静态内部类, 另一种是

方法中的内部类能不能访问方法中的局部变量,为什么?

/** * 答:方法中内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中, * 也只有当对该类的引用消失时,内部类才会消亡.而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈, * 即在内存中这个属性就消失了.也就是说,内部类的生命周期超过了方法中局部变量的生命周期, * 这样内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量. * 解决方法就是在局部变量前加修饰符final,此时局部变量就会存在堆中, * 生命周期跟工程的生命周期是一样的,此时

js string方法中的match,replace和search方法

match中也可用正则 返回的是数组 var str="i love you,  i love you"; str.match(/love/);//只返回一个love str.match(/love/g);//  /love/g后面的g是全局匹配,这时就返回两个love的数组 同理 str.replace(/love/g,"hate");//把全部love换成hate ,区分大小写(/love/g) str.replace(/love/gi,"hate&q

对HttpClient实现的 HTTP 方法中get、post有无参数方法抽取一个公共类

/** * 抽取一个公共的类 * * @author xz * */ @Service public class ApiService { @Autowired private RequestConfig config; @Autowired private CloseableHttpClient httpClient; /** * 无参的get请求 * * @param url * @return */ public String doGet(String url) { // HttpGet对

hibernate方法中参数传入数组的查询方法

public List<T> getByIds(Long[] ids) { return getSession().createQuery(// "FROM User WHERE id IN (:ids)")// .setParameterList("ids", ids)// .list(); }

[Android]在Adapter的getView方法中绑定OnClickListener比较好的方法

查看完整文章:http://www.cnblogs.com/tiantianbyconan/p/4146512.html 来自: "https://github.com/wangjiegulu/AndroidBucket/blob/master/src/com/wangjie/androidbucket/ 标签:AndroidBucket [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 public View getView(in