关于final大家都知道,网上一搜一大片,大体说的都是final的意思就是保证我们所定义的变量的值不可改变或者引用不可改变~~
总所周知,在java匿名类中我们要去使用外部的局部变量或者参数是,这个被匿名类使用的变量必须是final的,但是大家有没有想过为什么必须是final,总不能说他是final我们就写final好了,这做法白痴都会,接下来我们来讲解下其内部原因。
在介绍之前我们首先要讲解下java中的值传递和引用传递的问题,大家都知道java是值传递,例
public class Test {
public static void main(String[] args) {
String s ="out";
test1(s);
System.out.println(s);
}
public static void test1(String s){
s = "inner";
}
}
打印结果是:"out",这也就是java值传递导致的原因,简单分析下吧,在我们讲s变量传递到test1方法中去的时候,实际上是在栈上copy了一份s的引用,然后操作这个引用,当s重新赋值的时候地址就改变(String是不可变的嘛),完全没有影响到原先s的内容。
介绍了java值传递后,接下来我们来说回归正题,如下面这段代码:
//定义个抽象类
abstract class AbstractClass{
public abstract void m();
}
public static void test(final String s){
AbstractClass c = new AbstractClass(){
public void m(){
s = "inner";
System.out.println(s);
}
};
}
实际上这段代码是被编译成:
public static void test(final String s){
class OuterClass$1 extends AbstractClass{
private final String s;
public OuterClass$1(String s){
this.s = s;
}
public void m(){
s = "inner";
System.out.println(s);
}
};
AbstractClassc = new OuterClass$1(s);
}
可以看到s对象是被传递到了构造函数当中,当我们在使用m来打印出来,但如果java可以让我们以非final类型的参数传递进去的话。由java值传递可知,我们在匿名类中修改该变量的值,那在外部是不可见的。
举个最常见的例子,大家都写过button,我们为他添加匿名类事件监听器,如果我们在内部里面修改了外部变量的引用,那我们在外面是获取不到修改了的值的,这个可以接受?这也就是上面我们所举的值传递的例子。
所以结论出来了,我们在匿名类中需要传递进来final关键字,java希望的是保证内部实现和外在表现的一致性。
ok。。写完了自己的一些看法。一些内容参考部分内容参见http://blog.csdn.net/axman/archive/2006/12/25/1460544.aspx
分享到:
相关推荐
这意味着,即使在同一个`for`循环中多次使用相同的`new`语句创建匿名类的实例,也会创建多个相同类型的匿名类实例,而不是创建多个不同的匿名类实例。 例如: ```java for (int i = 0; i ; i++) { new Runnable()...
内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...
Java中的final关键字是一个非常重要的修饰符,它用于声明变量、方法和类,确保它们在程序执行期间保持不变。final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final...
同时,如果匿名内部类访问了外部类的非`final`局部变量,这些变量会被隐式地转换为`final`。 7. **内部类与内存管理** 内部类的对象会持有对外部类对象的引用,因此,只要内部类对象存在,外部类对象就不会被垃圾...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不定义单独类的情况下创建对象。这种类没有名字,通常用作一次性实现某个接口或继承某个类的需求。在Java编程中,匿名内部类主要用于事件处理、回调...
匿名类的声明在编译时完成,实例化在运行时执行,这意味着在循环中多次使用同一匿名类声明会产生多个相同的实例。 使用内部类和匿名类可以优化Java代码,提高代码的复用性和模块化。然而,过度使用或不恰当使用这些...
在上面的代码中,如果匿名类是final的,输出将是true,但匿名类默认不是final的。 7. **final与方法访问权限**: final关键字可以与public、protected、private以及static一起使用,来限制不同范围内的重写和隐藏...
- 匿名内部类不能包含静态成员(除了final static变量)。 - 匿名内部类不能有构造器,但可以通过初始化块来传递参数。 学习“Java4Android 35_内部类和匿名内部类”这个教程,开发者将掌握如何有效地利用内部类和...
- `Object`类中的`clone()`和`equals()`方法默认不是`final`的,但为了防止错误的重写,通常建议将自定义的这些方法声明为`final`。 3. **final类** - `final`类不能被其他类继承,这保证了类的封闭性,防止滥用...
局部内部类和匿名内部类是Java中的一种特性,它们允许我们在方法内部定义类。然而,一个重要的限制是,这些内部类只能访问在其作用域内的final或者实际上等效于final的局部变量。这是因为内部类可能在外部方法结束后...
在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能。在标题“发两个匿名内部类使用的例子”中,我们将会探讨两种不同的场景,如何利用匿名内部类来解决问题。这篇博客文章的...
`final`关键字还与匿名内部类和lambda表达式密切相关。当一个内部类实例化时,它隐含地捕获了包含它的外部类的一个引用。如果这个引用是`final`的,那么内部类就能安全地访问这个引用,因为外部类的状态不会在内部类...
匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在定义类的同时不为它提供名字。这种类主要用于创建一次性使用的对象,特别是在需要实现某个接口或者继承某个类的场合,而无需创建独立的文件来定义这个...
4. **匿名内部类**:`final`可以应用于局部变量,以便在匿名内部类中使用。这是因为内部类会捕获封闭作用域中的变量的副本,而`final`确保变量在内部类中不可变。 接下来,我们讨论`static`关键字。`static`主要...
Java中的匿名内部类参数引用需要用final进行修饰,这是因为内部类中使用的外部变量需要延长其生命周期,以便在回调时能够找到该变量。下面是详细的分析: 首先,方法中的局部变量的生命周期很短,方法结束后变量...
然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...
这是因为Lambda表达式实际上是一个匿名内部类,而`final`变量在内部类中是可访问的。 ```java final int number = 5; Runnable r = () -> System.out.println(number); // 可以访问final变量 ``` 此外,`final`...
3. 匿名类中的所有变量必须是 `final` 的。 4. `final` 方法不能被重写。 5. `final` 类不能被继承。 6. 未初始化的 `final` 变量被称为“空白 final 变量”,在编译时必须赋值。 了解这些 `final` 关键字的知识点...
Java是一种广泛使用的面向对象的编程语言,它提供了丰富的功能来帮助开发者构建各种应用程序...在实际开发中,合理地使用final和权限控制可以提高代码的安全性,而内部类的恰当应用则可以提升代码的表达力和组织结构。