`
wxj_siat
  • 浏览: 7696 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

方法中内部类只能访问外围类final型变量的原因

阅读更多
方法中的内部类只能使用外围类中final型的变量,网上有很多分析这样的原因,但是很少能够完全分析到位的。
1.内部类中也不一定只能使用final型的变量,如果这个参数直接传给了内部类的构造方法,而且没有在内部类中使用,那这样也是能够通过编译的,所以网上有说是由于生命周期的原因,个人觉得不是太准确,因为如果是由于生命周期的问题,这个时候也应该只能允许final型的才对,因为这个时候基类中是可以改变这个变量的值的,但是这个很明显就是传了一个参数给构造函数,所以也不会造成误解(见第3点),所以就没有final型的限制。
2.其实在内部类中使用变量参数时,编译过程中内部类是在内部类对象中生成了一个变量和外围类中这个变量时一样的名字,这样做有助于把内部类和一般的类统一处理,提高了效率(并不需要判断哪些是外围类哪些是内部类,执行过程中他们都是对象)。
3.基于第2点,实际上就相当于是两个名字一样的变量,但是在程序员眼里它们又都是在同一方法里面使用,他们会觉得就是同一个变量,为了避免这样的错误,编译器就干脆要求是final型的。
0
0
分享到:
评论

相关推荐

    Java中的内部类应用举例

    由于局部内部类在方法内部定义,它可以访问该方法中的所有局部变量,但这要求局部变量必须被声明为`final`,以确保在类定义时变量的值已经确定。 3. **匿名内部类**:匿名内部类是一种没有名称的内部类,它通常用于...

    Java内部类详解.pdf

    局部内部类可以访问其所在方法或块的局部变量,但这些变量必须声明为final。 7. **嵌套类**: 嵌套类是所有内部类的总称,包括静态和非静态内部类。嵌套类的概念比内部类更宽泛,内部类是嵌套类的一个子集。 8. *...

    Java为什么匿名内部类参数引用需要用final进行修饰?

    进一步解释,内部类中使用的外部变量需要是final的,这是因为内部类本身都会含有一个外围了的引用(外围类.this),这样在回调时一定可以访问到该变量。但是,如果内部类中使用的外部变量是方法中的局部变量,那么该...

    《面向对象技术与方法》12、大型程序.pdf

    局部类可以访问外部方法中的局部变量,但这些变量必须被声明为`final`。 - **匿名类**:没有显式名称的局部类,通常用于实现接口或继承类。匿名类经常在创建对象时直接定义,例如在事件监听器或简单的接口实现中。 ...

    java基础难点-更新版

    * 内部类可以继承外围类的成员变量和方法 * 内部类可以独立继承一个接口或类 * 内部类可以多实例,每个实例都有自己的状态信息 * 内部类提供了更好的封装,除了外围类,其他类都不能访问 3. 匿名内部类: * 匿名...

    java PPT资源

    内部类可以访问其外围类的私有成员。 - **类型**:根据定义位置的不同,内部类分为四种类型——成员内部类、局部内部类、静态内部类和匿名内部类。 以上就是从给定的文件标题、描述及部分内容中提取出来的关键Java...

    java开发中嵌套类的详解及实例

    成员嵌套类是定义在外围类的成员变量中的类。成员嵌套类可以使用public、private、protected访问控制符,也可以使用static、final关键字。成员嵌套类可以访问外围类的所有成员变量和方法。 2. 局部嵌套类(Local ...

    2015年软考初级模拟题:java程序员面试10道题.pdf,这是一份不错的文件

    - Inner Class(内部类)与外围类实例紧密关联,每个内部类对象都必须与一个外围类对象关联,可以访问外围类的所有成员。 10. **ArrayList 和 Vector 的区别** - 同步性:`Vector` 是线程安全的,而 `ArrayList` ...

    Java面试宝典2011版

    - `Static Nested Class`(静态嵌套类)没有对外围类的隐式引用,因此可以访问外围类的静态成员,而`Inner Class`(内部类)则具有对外围类的隐式引用。 26. **内部类引用外部类成员的限制** - 内部类可以直接...

    java程序员面试大全

    内部类是定义在另一个类的内部的类,包括静态内部类(StaticNestedClass)和内部类(InnerClass),它们在访问外围类成员时有不同的限制。匿名内部类不能继承其他类,但可以实现接口。class.forName()方法用于动态...

    各种资料,Java

    内类是Java中的一种特殊类,它定义在另一个类的内部。内类可以更好地隐藏代码,提供封装性,并且可以方便地访问外围类的私有成员。根据其访问权限和与外围类的关系,内类可以分为四种类型:成员内类、局部内类、匿名...

    JAVA程序员面试32问

    - **Inner Class**(内部类):非静态嵌套类,它可以访问外围类的所有成员,包括私有成员。每个内部类实例都隐含了一个对其外围类实例的引用。 #### 第四,& 和 && 的区别 - **&**:逻辑与运算符,也是按位与...

    2022年中软国际Java程序员笔试题及答案.doc

    - Inner Class(内部类):依赖于外围类实例,需要外围类实例才能创建,不能有静态成员,可以通过外围类实例访问。 4. **& 和 && 的区别**: - `&`:既是按位与运算符,也是逻辑与运算符。在逻辑表达式中,如果...

    中软国际Java程序员笔试题及标准答案.doc

    - **Inner Class** 隐式地保持了一个指向外围类的引用,这意味着内部类对象可以访问外围类的所有成员(包括私有成员)。这也意味着每个内部类对象都隐含了一个对其外围类对象的引用,这可能会影响垃圾回收机制的...

    Java程序员常见笔试题

    匿名内部类可以实现接口,但不能继承其他类,因为它本质上是为其外围类的一个私有内部类。匿名内部类通常在需要快速创建实现特定接口的对象时使用,例如在事件监听器中。 #### 三、Static Nested Class与Inner ...

    中软国际Java程序员笔试题及答案.pdf

    final是Java中的修饰符,用于修饰类、变量或方法,表示它们不能被继承、修改或重载。finally是异常处理时提供的finally块,用于执行清除操作。finalize是Java中的一个方法,用于垃圾收集器在将对象从内存中清除前...

    java32问(面试题)

    匿名内部类本质上是一个没有名称的内部类,它不能直接继承自其他类(除了作为其外围类的一部分),但它可以实现一个或多个接口。这意味着匿名内部类可以提供一种快速的方式去实现接口中的方法,而无需定义一个完整的...

    20XX年软考初级模拟题:java程序员面试10道题..pdf,这是一份不错的文件

    它可以访问外围类的非静态成员。 10. **ArrayList 和 Vector的区别**: - **ArrayList** 是非同步的,适合单线程环境,插入和删除操作更快,因为无需同步。 - **Vector** 是同步的,适合多线程环境,但性能较差,...

    java面试常问的问题

    Inner Class必须依附于外围类实例,可以访问外围类的非静态成员。 4. **& 和 &&**:&是按位与运算符,&&是逻辑与运算符,后者在短路逻辑中仅当第一个操作数为真时才评估第二个操作数。 5. **HashMap 和 Hashtable*...

    java基础学习词汇

    这些访问控制符决定了类、成员变量、方法等的可见性范围。 #### Algorithm (算法) 算法是指解决特定问题的一系列步骤或指令集。在编程领域,尤其是数据处理和计算密集型任务中,算法的设计与优化至关重要。Java...

Global site tag (gtag.js) - Google Analytics