`
舟迹天涯
  • 浏览: 3976 次
社区版块
存档分类
最新评论

java中的匿名内部类总结

    博客分类:
  • java
阅读更多
匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口



实例1:不使用匿名内部类来实现抽象方法

abstract class Person {
    public abstract void eat();
}

class Child extends Person {
    public void eat() {
        System.out.println("eat something");
    }
}

public class Demo {
    public static void main(String[] args) {
        Person p = new Child();
        p.eat();
    }
}
运行结果:eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类



实例2:匿名内部类的基本实现

abstract class Person {
    public abstract void eat();
}

public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}
运行结果:eat something

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上


实例3:在接口上使用匿名内部类
interface Person {
    public void eat();
}

public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}
运行结果:eat something



由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是实现Runnable接口



实例4:Thread类的匿名内部类实现
public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}
运行结果:1 2 3 4 5



实例5:Runnable接口的匿名内部类实现

public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}
运行结果:1 2 3 4 5



2.匿名内部类的注意事项
   注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个

new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。

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

  


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




分享到:
评论

相关推荐

    java 匿名内部类的使用规范

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

    170331-01.匿名内部类总结.java

    170331-01.匿名内部类总结.java 170331-01.匿名内部类总结.java 匿名 内部类 总结 java

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

    这篇总结将深入探讨匿名内部类的相关知识点。 1. **匿名内部类的概念** 匿名内部类是内部类的一种特殊形式,它没有类名,常用于一次性创建的对象,特别是在需要实现一个接口或继承一个类,但又不需要额外的方法时...

    Java中的内部类和匿名类

    Java 中的内部类和匿名类 Java 中的内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在 C++ 里也有,那就是嵌套类(Nested Class)。内部类从表面上看,就是在类中又定义了一个类,而实际上并没有那么...

    Java内部类总结

    Java内部类主要包括以下几种类型:成员内部类(非静态内部类)、静态内部类(也称为静态嵌套类)、局部内部类和匿名内部类。 - **成员内部类**:这种类型的内部类是定义在外部类的一个成员位置上,它可以访问外部类...

    java内部类总结(含概念和实例)

    Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...

    java中的内部类总结

    - 内部类可以用于事件处理,比如 Swing 中的监听器,通过匿名内部类快速实现功能。 - 创建特定环境下的对象,如线程、定时任务等。 总之,Java 内部类提供了一种强大的工具,可以增强代码的封装性和可读性,同时...

    Android开发匿名内部类

    总结来说,匿名内部类是Java编程中一种强大的工具,它允许开发者快速实现接口,简化代码,特别是在需要事件处理或访问外部类私有成员的场景下。在Android开发中,匿名内部类经常用于创建自定义的`OnClickListener`、...

    Java语法总结 - 内部类

    匿名内部类可以使用在外部类的方法和构造方法中。 内部类是Java语言中的一种特殊类别,它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和...

    Android 匿名内部类作为事件监听类

    在Java中,匿名内部类是没有名字的类,它可以直接继承一个类或实现一个接口。在Android中,由于大部分事件处理都是基于接口实现的,如OnClickListener、OnCheckedChangeListener等,因此我们通常会用匿名内部类来...

    JAVA内部类总结

    内部类分为四类:非静态成员内部类、静态成员内部类、局部内部类和匿名内部类。接下来将逐一介绍这四种类型的内部类。 #### 二、非静态成员内部类 非静态成员内部类是最常见的一种内部类形式,它具有以下特点: 1...

    Java中的内部类总结.doc

    匿名内部类是在没有名称的情况下定义的内部类,通常用于快速实现接口或继承类的简单情况。它们常用于事件监听器和回调机制中,可以简化代码,但不能包含任何静态声明。 5. **内部类的作用**: - **多态性增强**:...

    Java特别篇-匿名对象与匿名内部类

    通过以上内容,我们可以看到Java中的匿名对象和匿名内部类都是十分实用的功能。匿名对象简化了代码,使我们能够更灵活地处理临时对象的需求;而匿名内部类则为我们提供了一种简洁的方式去实现接口或继承类,尤其是在...

    java中的匿名内部类详细总结

    以下是关于Java匿名内部类的详细总结: 1. **继承父类的匿名内部类**: 当你需要创建一个类的对象,而这个类只有一个方法需要实现时,可以使用匿名内部类。例如,`abstract class Person` 定义了一个抽象方法 `eat...

    匿名内部类实现接口回调

    匿名内部类是Java中的一种特殊类,它没有名称,可以直接实例化,并且可以继承一个类或实现一个(多个)接口。在接口回调的场景下,我们可以使用匿名内部类快速地创建一个实现了接口的实例,而无需定义一个新的类。...

    内部类 匿名内部类 内部接口 对比说明

    总结一下,内部类、匿名内部类和内部接口在Java编程中提供了一种强大的工具,它们可以帮助我们更好地组织代码,实现封装和模块化。在Android开发中,它们常用于事件监听、线程管理、回调函数等场景,增强了代码的...

Global site tag (gtag.js) - Google Analytics