`
squall140
  • 浏览: 140892 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

JAVA 匿名内部类说明

阅读更多

 

匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。


也可以是一个类但是你外部调用的方法必须在你的这个类或接口中声明外部不能调用匿名类内部的方法

Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧。
如下:


import java.awt.*;   
import java.awt.event.*;   
  
public class QFrame extends Frame {   
    public QFrame() {   
           this.setTitle(\"my application\");   
  
           addWindowListener(new WindowAdapter() {   
                   public void windowClosing(WindowEvent e) {   
                   dispose();   
                   System.exit(0);   
}   
            });     
  
          this.setBounds(10,10,200,200);   
     }   
}   
 


    内部匿名类,就是建立一个内部的类,但没有给你命名,也就是没有引用实例的变量。
    new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
                 dispose();
                 System.exit(0);
         }

        new 是建立一个 WindowAdapter对象 ,后面一个 {} 表示这个括号中的操作作用于这个默认的对名象,而上面的Java程序中后面是一个函数体。
    这个用法的作用是:创建一个对象的实例,并且 override 它的一个函数。打开 WindowAdapter 的代码可以发现。它是一个抽象类。它是对 WindowListener 接口的一个实现。Frame.addWindowListner(); 的参数是一个 WindowListner ,而实现上是传一个从WindowAdapter 派生出的一个匿名类。

    1.怎样判断一个匿名类的存在啊?看不见名字,感觉只是父类new出一个对象而已,没有匿名类的名字。

    先看段伪代码

    abstract class Father(){
    ....
    }
    public class Test{
       Father f1 = new Father(){ .... }  //这里就是有个匿名内部类
    }
     
    一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。
    但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。
    因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。
    上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。
    其实拆分上面的匿名内部类可为
    class SonOne extends Father{
      ...       //这里的代码和上面匿名内部类,大括号中的代码是一样的
    }
    public class Test{
       Father f1 = new SonOne() ;
    }
     

    2.匿名内部类的注意事项

       注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。

    在使用匿名内部类时,要记住以下几个原则:
     ·匿名内部类不能有构造方法。  
     ·匿名内部类不能定义任何静态成员、方法和类。  
     ·匿名内部类不能是public,protected,private,static。  
     ·只能创建匿名内部类的一个实例。
      ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。  
     ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

      ·内部类只能访问外部类的静态变量或静态方法。

     

    匿名类和内部类中的中的this :
    有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名

    3.匿名内部类的作用

        Java的内部类和C++中的嵌套类有本质的不同:C++的嵌套类没有指向包装类的句柄。仅仅表达一个封装的概念;但是Java的内部类不同,它可以访问包装类的成员(这表示它拥有指向包装类的句柄)。
         匿名内部类是内部类的一种简化写法:return new Wrapper {
                                            ...
                                         };
         等价于:Wrapped extends Wrapper {
              ...
              }
              return new Wrapped();

      难道匿名内部类就只这一点作用吗?
      考虑一下这样的case:

      interface ICount {

        int count();
      }
     
      class Parent {
        int i = 0;
        int count() {
          return i++;
        }
      }
     
           有一个类Child,它既想继承Parent的count()方法,又想实现ICount接口中的count方法,这个时候怎么办呢?内部类就可以大显身手了:
      class Child extends Parent {

        ICount getCount() {
          return new ICount {
            int i = 0;
            int count() {
             return (i *= 2);
            }
          }
        }
      }
     

     

    分享到:
    评论

    相关推荐

      Java内部类和匿名内部类的用法说明

      主要介绍了Java内部类和匿名内部类的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

      观看韩顺平学习整理java的笔记到异常

      匿名内部类的使用(重要!!!!!!!) 13 成员内部类的使用 13 静态内部类的使用 14 枚举的二种实现方式 14 自定义类实现枚举 14 使用 enum 关键字实现枚举注意事项 15 enum 用方法说明 15 enum 实现接口 15 注解的理解 16...

      Java开发详解.zip

      020613_【第6章:面向对象(高级)】_匿名内部类笔记.pdf 020701_【第7章:异常的基本概念】_异常的基本概念笔记.pdf 020702_【第7章:异常的基本概念】_异常的其他概念笔记.pdf 020801_【第8章:包及访问控制权限】...

      java经典面试题汇总

      2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...

      JAVA笔试题集锦(1-30)基础部分

      2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...

      corejava培训文档

      匿名内部类 7.12. 集合 7.12.1. 集合接口类层次 7.12.2. 集合类层次 7.12.3. 五个最常用的集合类之间的区别和联系 7.12.4. 比较 7.13. 反射 8. 七 异常 8.1. 异常的基本概念 8.2. 捕获异常 8.3. ...

      JAVA语言程序设计【高清版】.pdf

      90 5.7.2 接口的定义 91 5.7.3 接口的实现 91 5.8 Java包 94 5.8.1 Java包的概念 94 5.8.2 import语句 95 5.9 内部类 97 5.9.1 内部类的概念 97 5.9.2 匿名类 99 习题 100 第6章 数组、容器和字符...

      JAVA面试题最全集

      一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

      java学习笔记 初学者必读

      7.11.5. 匿名内部类 7-31 7.12. 集合 7-31 7.12.1. 集合接口类层次 7-32 7.12.2. 集合类层次 7-33 7.12.3. 五个最常用的集合类之间的区别和联系 7-33 7.12.4. 比较 7-35 7.13. 反射 7-37 8. 七•异常 8-37 8.1. 异常...

      java 面试题 总结

      java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

      【05-面向对象(下)】

      •匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: •new 父类构造器(实例列表) |实现接口) •{ • //匿名内部类的 类体部分 •} •匿名内部类不能是抽象类,匿名内部类不能定义...

      Lambda表达式的相关用法

      Lambda and Anonymous Classes(I),展示如何使用Lambda表达式替代匿名内部类,说明Lambda表达式和函数接口的关系。 Lambda and Anonymous Classes(II),Lambda表达式的实现原理 Lambda and Collections,学习Java...

      Java面试宝典-经典

      28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String是最基本的数据类型吗? 22 31、String s = ...

      Java学习题答案

      Anonymous Inner Class (匿名内部类) 可以extends(继承)其它类 13 final类是为防止他人从你的类上派生新类,此类是不可继承的。 14 super()和this()方法只能在构造函数里调用. 15 方法的参数变量不能是...

      Java面试宝典2010版

      28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String是最基本的数据类型吗? 22 31、String s = "Hello...

      java面试宝典

      44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)? 12 45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制是什么...

      java面试题大全(2012版)

      28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String是最基本的数据类型吗? 22 31、String s = "Hello...

      java面试题

      29. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 15 30. 构造器Constructor是否可被override 15 31. try {}里有一个return语句,那么紧跟在这个try...

      java面试宝典2012版.pdf

      28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 29、super.getClass()方法调用 30、String是最基本的数据类吗? 31、String s = "Hello";s = s +...

    Global site tag (gtag.js) - Google Analytics