`

Anonymous Inner Class (匿名内部类)

阅读更多
匿名内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现.

一、由于匿名内部类没有名字,所以它没有构造函数。因为没有构造函数,所以它必须完全借用父类的构造函数来实例化,换言之:匿名内部类完全把创建对象的任务交给了父类去完成。

二、在匿名内部类里创建新的方法没有太大意义,但它可以通过覆盖父类的方法达到神奇效果,如上例所示。这是多态性的体现。

三、因为匿名内部类没有名字,所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型。

new <类或接口> <类的主体>

匿名类

匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。

这就要采用另一种形式的new语句,如下所示:


new <类或接口> <类的主体>

这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。

如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。

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

从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。

如果要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用。匿名类尤其适合在Swing应用程序中快速创建事件处理程序。

exp:
Java代码

   1. return new Contents() { 
   2. private int i = 11; 
   3. public int value() { return i; } 
   4. }; 

return new Contents() {
private int i = 11;
public int value() { return i; }
};



这种奇怪的语法要表达的意思是:“创建从Contents衍生出来的匿名类的一个对象”。由new表达式返回的句柄会自动上溯造型成一个Contents句柄。匿名内部类的语法其实要表达的是:

class MyContents extends Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
若试图定义内部类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象必须是final属性.
Java代码

   1. public class Parcel9 { 
   2. public Destination 
   3. dest(final String dest, final float price) { 
   4. return new Destination() { 
   5. private int cost; 
   6. // Instance initialization for each object: 
   7. { 
   8. cost = Math.round(price); 
   9. if(cost > 100) 
  10. System.out.println("Over budget!"); 
  11. } 
  12. private String label = dest; 
  13. public String readLabel() { return label; } 
  14. }; 
  15. } 
  16. public static void main(String[] args) { 
  17. Parcel9 p = new Parcel9(); 
  18. Destination d = p.dest("Tanzania", 101.395F); 
  19. } 
  20. }  
分享到:
评论

相关推荐

    java易混淆概念Anonymous Inner Class

    Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类?匿名内部类是没有名字的内部类。不能 extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 final 修饰符(关键字)...

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    另外,在Java面试中,Anonymous Inner Class(匿名内部类)也是一个重要的知识点。匿名内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 在Java中,还有...

    Anonymous inner class1---马克-to-win java视频

    匿名内部类 inner class 马克-to-win java视频的详细介绍

    Java面试大合集

    匿名内部类是没有名字的内部类。不能extends继承其他类,但一个内部类可以作为一个接口,由另一个内部类实现。 final, finally, finalize 的区别 1. final—修饰符(关键字)如果一个类被声明为final,意味着它不...

    匿名内部类代码

    匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在需要的地方直接定义一个类的实例,而无需声明一个独立的类。这种类没有名字,通常用于实现接口或者继承抽象类,尤其在事件处理、回调函数以及创建一次...

    Android内存泄漏的八种可能.pdf

    第七种可能:Anonymous Inner Class 匿名内部类可能会导致内存泄漏,如果匿名内部类在 Activity 生命周期结束后没有被释放,可能会导致内存泄漏。 第八种可能:Custom View 自定义的 View 也可能会导致内存泄漏,...

    java-内部类(InnerClass)详解.pdf

    内部类分为几种类型,包括静态成员类(Static member class)、局部内部类(Local inner class)、匿名内部类(Anonymous inner class)以及嵌套接口(Nested interface)。在本讨论中,我们将主要聚焦于静态成员类...

    Anonymous inner class3---马克-to-win java视频

    匿名内部类 inner class 马克-to-win java视频的详细介绍

    内部类的相关知识-静态内部类,匿名内部类……

    public class AnonymousInnerClass { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("匿名内部类的run方法"); } }; ...

    JAVA_匿名内部类

    这里,我们创建了一个匿名内部类来继承`BaseClass`并实现了`print`方法。 4. **局部变量和final关键字** 匿名内部类可以访问其所在的作用域内的局部变量,但必须注意,对于非final的局部变量,匿名内部类只能引用...

    Android开发导入项目报错Ignoring InnerClasses attribute for an anonymous inner class的解决办法

    当编译器遇到匿名内部类时,会生成这种属性。在某些情况下,如使用ProGuard或混淆代码时,如果处理不当,可能会出现忽略这个属性的警告。 最初,开发者可能会误以为这是由于第三方库的jar包问题,于是尝试替换对应...

    java内部类详解

    4. 匿名内部类(Anonymous Inner Class) 匿名内部类没有名字,通常用于简短的、一次性的实现。它们常用于接口回调或简化创建继承自特定类或实现特定接口的新类。匿名内部类可以直接实例化,如 `new Interface() { ...

    JAVA基础知识问答大全

    匿名内部类常用于简化代码,尤其是在Lambda表达式出现之前的事件监听器等场景中非常常见。 #### 3. Static Nested Class 和 Inner Class 的区别 Java中的`Inner Class`和`Static Nested Class`(静态嵌套类)有...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    11.内部类.doc

    4. 匿名内部类(Anonymous Inner Class) 匿名内部类没有名字,通常用于简洁地实现单个接口或继承单个类,并且往往与事件监听器、回调函数等场景结合使用。它会隐式地继承一个类或实现一个接口,并可以覆盖父类方法...

    java面试笔试题大汇总.pdf

    匿名内部类是Java中的一种特殊类,它没有名称,但可以实现接口或继承自另一个类。它可以作为方法参数传递,或者在需要的地方立即实例化,常用于事件监听器或lambda表达式的前身。 ### 3. Static Nested Class vs. ...

    java面试笔试题大汇总.doc

    匿名内部类可以实现接口或继承其他类,但只能在需要它的上下文中声明和创建,没有显式的名字,通常用于简化代码,尤其是在Lambda表达式出现之前。 #### 三、Static Nested Class 和 Inner Class 的不同 - **Inner ...

    匿名内部类

    所谓匿名内部类(anonymous inner class),是指可以利用内部类创建没有名称的对象,它一步完成了声明内部类和创建该类的一个对象,并利用该对象访问到类内的成员,这种类不取名字,而是直接用其父类的名字或者它所...

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

    Java内部类和匿名内部类的用法说明 Java内部类和匿名内部类是Java编程语言中两个重要的概念,它们在Java编程中扮演着非常重要的角色。内部类可以访问外部类的成员变量和方法,而匿名内部类则是内部类的一种特殊形式...

    内部类的分类及各自用法

    根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...

Global site tag (gtag.js) - Google Analytics