专自:http://lineageii.iteye.com/blog/32404
匿名内部类为什么只能用final.是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
以下代码为本人所写
package com.cxz.j2se;
public class MyClass {
public MyClass() {
final int finalValue = 10;
int not$Final = 20;
MyInterface myInterface = new MyInterface() {
public void functionWithoutPara() {
//compile Error
//System.out.println(noFinal);
System.out.println(finalValue);
}
public void functionWithPara(int num) {
System.out.println("The parameter " + num
+ " has been passed by the method");
}
};
myInterface.functionWithoutPara();
myInterface.functionWithPara(not$Final);
System.out.println(myInterface.getClass().getName());
}
public static void main(String[] args) {
new MyClass();
}
}
分享到:
相关推荐
总结来说,局部内部类和匿名内部类只能访问final或等效final的局部变量,这是为了保证代码的可读性和内存管理的正确性。通过使用final关键字,我们可以确保内部类所使用的变量在创建后不会被意外地修改,从而避免了...
如果匿名内部类需要访问局部变量,那么这个局部变量必须是final的或者实际上等效于final。这是因为匿名内部类可以异步执行,它们可能在局部变量的生命周期结束后仍然需要访问这些变量。 4. **单例模式中的应用** ...
Java匿名内部类可以用来直接实现一个接口,无需为这个接口创建单独的实现类。这在处理事件监听时特别常见,比如在Swing或Android开发中,我们可以直接在需要的地方创建一个匿名内部类来实现事件处理器接口。 2. **...
- 匿名内部类不能包含静态成员(除了final static变量)。 - 匿名内部类不能有构造器,但可以通过初始化块来传递参数。 学习“Java4Android 35_内部类和匿名内部类”这个教程,开发者将掌握如何有效地利用内部类和...
这种内部类的生命周期仅限于该方法的执行,可以访问方法的局部变量和参数,但对这些局部变量的访问有一些限制,它们必须是final或者等效于final的。 4. **局部内部类**:定义在方法、块或者构造器内部的类称为局部...
同时,如果匿名内部类访问了外部类的非`final`局部变量,这些变量会被隐式地转换为`final`。 7. **内部类与内存管理** 内部类的对象会持有对外部类对象的引用,因此,只要内部类对象存在,外部类对象就不会被垃圾...
- 由于`a`不是final变量,因此JVM不会为其创建副本,导致无法在`Inner`类中访问。 #### 总结 - 局部内部类可以访问所在方法中定义的final局部变量。 - 这种访问机制背后的关键在于JVM的行为,即为final局部变量...
- **局部内部类**:在方法或作用域内定义,只能访问该作用域内的变量(需final修饰)和外部类的静态成员。 3. **匿名内部类与接口** - **实现接口**:匿名内部类可以直接实现一个接口,并提供接口中所有方法的...
它可以访问外部类的所有成员以及所在方法的final变量。局部内部类主要用于方法内部的特定逻辑,对外不可见。 3. **静态内部类(嵌套类)**:在类的任何方法之外,用static关键字定义。静态内部类可以直接访问外部类...
- 匿名内部类可以是方法或代码块内的局部类,这使得它们只能在该方法或代码块内被访问。 3. **匿名内部类的作用域**: - 它们的作用域仅限于它们被创建的位置,因此它们可以访问并修改其封闭范围内的局部变量,但...
如果这个引用是`final`的,那么内部类就能安全地访问这个引用,因为外部类的状态不会在内部类的生命周期内改变。同样,在Java 8及更高版本中,`final`局部变量可以作为lambda表达式的捕获变量,保证了lambda表达式...
在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...
局部内部类是在方法内部定义的类,只能在该方法内部访问。匿名内部类是在使用时才临时定义的一个没有类名的类,通常用于实现事件监听器或其他一次性的接口。 了解了这些概念,让我们回到Java基础权限控制与final,...
这是因为内部类可以访问外部类的final或effectively final变量,而这些变量被视为常量。 3. **代码优化**:JVM可能会对`final`局部变量进行优化,如逃逸分析,将它们存储在栈上而不是堆上,提高运行效率。 4. **...
Java中的匿名内部类参数引用需要用final进行修饰,这是因为内部类中使用的外部变量需要延长其生命周期,以便在回调时能够找到该变量。下面是详细的分析: 首先,方法中的局部变量的生命周期很短,方法结束后变量...
匿名内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。匿名内部类可以使用在外部类的方法和构造方法中。 内部类是Java语言中的一种特殊类别,它可以访问外部类的所有成员变量和方法,包括私有的...
- 局部内部类的所有限制也适用于匿名内部类,这意味着它们不能是顶级类,也不能访问外部类的非 `final` 局部变量。 3. **语法示例**: 在Java中,匿名内部类的语法可能会显得有些奇特。例如,以下代码展示了如何...
匿名内部类可以访问其所在的作用域内的局部变量,但必须注意,对于非final的局部变量,匿名内部类只能引用它们的值,而不是变量本身。这是因为当匿名内部类被创建时,它可能在外部作用域之后仍然存活,所以需要这些...
不过,需要注意的是,匿名内部类只能继承非final的本地类或者静态嵌套类,因为Java的内存管理机制限制了非静态内部类对它们的外部类有隐含的引用,这可能导致内存泄漏问题。 在课程中,徐培成老师可能会通过示例...