• 局部内部类访问方法的参数和局部变量必须是final的


            内部类的种类一共分为四种,我看其他几种内部类的时候思路都是很清晰的,然后我就碰到了这一条:“方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问”。于是我就有点疑惑,为什么必须是final的?

            于是我就试了一下访问不是final的变量,发现eclipse给出了错误提示:Cannot refer to the non-final local variable localVal defined in an enclosing scope。不能在一个即将关闭的作用域内尝试引用一个非final的变量。差不多我就理解了,因为方法内的参数或者是局部变量的话,当这个方法执行结束之后,它们也就被释放了。加入内部类中的一个引用指向了这个局部变量,再次尝试访问时,就会发生错误。

           给出下面的例子:

    1. public class AnonymousClass {  
    2.     public Object makeInner(String localVal){  
    3.         return new Object(){  
    4.             private String s = localVal;  
    5.             public String toString(){  
    6.                 return s;  
    7.             }  
    8.         };  
    9.     }  
    10.     public static void main(String[] args) {  
    11.         AnonymousClass ac = new AnonymousClass();  
    12.         Object ob = ac.makeInner("23");  
    13.         System.out.println(o.toString());  
    14.     }  
    15. }  

          程序new了一个类对象,然后调用了makeInner方法,传递了一个String类型的参数,进入到方法内部,返回了一个内部匿名类。匿名类中成员引用变量s跟参数localVal指向相同的内存地址,并在重写的toString方法中,返回了成员变量s。调用结束,localVal指向的内存空间释放,返回到主程序,调用ob的toString方法,输出s,但是此时的s指向的内存地址已经被释放了,所以程序是不会让你这么干的。所以内部类访问所在方法的参数或局部变量为什么必须是final的,因为方法结束之后他们空间并没有释放,依然是有效的。

  • 相关阅读:
    redis基础
    Django Meta
    Django Query
    Django FileFieldManage
    Django Managers管理器
    Django 模型
    Pytables h5py
    python 高级部分
    Python和HDF 5大数据应用
    是时候放弃pipeline 模型 ?
  • 原文地址:https://www.cnblogs.com/qjjazry/p/6112315.html
Copyright © 2020-2023  润新知