`
491823151
  • 浏览: 4511 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

匿名类中的final

    博客分类:
  • Java
阅读更多

 

关于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()...

    java 内部类使用(内部匿名类)

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    Java中final的深度剖析

    Java中的final关键字是一个非常重要的修饰符,它用于声明变量、方法和类,确保它们在程序执行期间保持不变。final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final...

    内部类知识总结3--匿名内部类

    同时,如果匿名内部类访问了外部类的非`final`局部变量,这些变量会被隐式地转换为`final`。 7. **内部类与内存管理** 内部类的对象会持有对外部类对象的引用,因此,只要内部类对象存在,外部类对象就不会被垃圾...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...

    Java 匿名内部类

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不定义单独类的情况下创建对象。这种类没有名字,通常用作一次性实现某个接口或继承某个类的需求。在Java编程中,匿名内部类主要用于事件处理、回调...

    使用内部和匿名类优化Java代码

    匿名类的声明在编译时完成,实例化在运行时执行,这意味着在循环中多次使用同一匿名类声明会产生多个相同的实例。 使用内部类和匿名类可以优化Java代码,提高代码的复用性和模块化。然而,过度使用或不恰当使用这些...

    深入解析Java编程中final关键字的作用

    在上面的代码中,如果匿名类是final的,输出将是true,但匿名类默认不是final的。 7. **final与方法访问权限**: final关键字可以与public、protected、private以及static一起使用,来限制不同范围内的重写和隐藏...

    Java4Android 35_内部类和匿名内部类

    - 匿名内部类不能包含静态成员(除了final static变量)。 - 匿名内部类不能有构造器,但可以通过初始化块来传递参数。 学习“Java4Android 35_内部类和匿名内部类”这个教程,开发者将掌握如何有效地利用内部类和...

    Java中的final关键字

    - `Object`类中的`clone()`和`equals()`方法默认不是`final`的,但为了防止错误的重写,通常建议将自定义的这些方法声明为`final`。 3. **final类** - `final`类不能被其他类继承,这保证了类的封闭性,防止滥用...

    局部内部类和匿名内部类使用局部变量为什么要final1

    局部内部类和匿名内部类是Java中的一种特性,它们允许我们在方法内部定义类。然而,一个重要的限制是,这些内部类只能访问在其作用域内的final或者实际上等效于final的局部变量。这是因为内部类可能在外部方法结束后...

    发两个匿名内部类使用的例子

    在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能。在标题“发两个匿名内部类使用的例子”中,我们将会探讨两种不同的场景,如何利用匿名内部类来解决问题。这篇博客文章的...

    final类,方法,变量

    `final`关键字还与匿名内部类和lambda表达式密切相关。当一个内部类实例化时,它隐含地捕获了包含它的外部类的一个引用。如果这个引用是`final`的,那么内部类就能安全地访问这个引用,因为外部类的状态不会在内部类...

    匿名内部类核心重点知识讲解和经典例子讲解

    匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在定义类的同时不为它提供名字。这种类主要用于创建一次性使用的对象,特别是在需要实现某个接口或者继承某个类的场合,而无需创建独立的文件来定义这个...

    java中final和static的总结

    4. **匿名内部类**:`final`可以应用于局部变量,以便在匿名内部类中使用。这是因为内部类会捕获封闭作用域中的变量的副本,而`final`确保变量在内部类中不可变。 接下来,我们讨论`static`关键字。`static`主要...

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

    Java中的匿名内部类参数引用需要用final进行修饰,这是因为内部类中使用的外部变量需要延长其生命周期,以便在回调时能够找到该变量。下面是详细的分析: 首先,方法中的局部变量的生命周期很短,方法结束后变量...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    Java中final共2页.pdf.zip

    这是因为Lambda表达式实际上是一个匿名内部类,而`final`变量在内部类中是可访问的。 ```java final int number = 5; Runnable r = () -> System.out.println(number); // 可以访问final变量 ``` 此外,`final`...

    深入理解Java中的final关键字_动力节点Java学院整理

    3. 匿名类中的所有变量必须是 `final` 的。 4. `final` 方法不能被重写。 5. `final` 类不能被继承。 6. 未初始化的 `final` 变量被称为“空白 final 变量”,在编译时必须赋值。 了解这些 `final` 关键字的知识点...

    Java基础权限控制与final,内部类

    Java是一种广泛使用的面向对象的编程语言,它提供了丰富的功能来帮助开发者构建各种应用程序...在实际开发中,合理地使用final和权限控制可以提高代码的安全性,而内部类的恰当应用则可以提升代码的表达力和组织结构。

Global site tag (gtag.js) - Google Analytics