Java内部类(一)——匿名内部类

Java匿名内部类

顾名思义,就是没有名字的内部类。表面上看起来它们似乎有名字,实际上不是它们的名字。 ——百度百科

特性说明

  • 没有名字的类
  • 既然这个类没有名字,那么就只能使用一次,进而简化代码编写
  • 前提条件:必须继承一个父类或者实现一个接口

声明格式

new ParentName(){
    ... // 内部类的定义
}

实例分析

abstract class Animal {
    public abstract void run();
}

class Fish extends Animal {
    public void run() {
        System.out.println("Swimming!");
    }
}

public class Main {
    public static void main(String[] args) {
        Fish fish = new Fish();
        fish.run();
    }
}

// 运行结果:Swimming!

如果我们这个类只使用一次,那么我们创建这样一个类岂不是很浪费?所以就有了匿名内部类的出现。

abstract class Animal {
    public abstract void run();
}

public class Main {
    public static void main(String[] args) {
        Animal fish = new Animal(){
            public void run() {
                System.out.println("Swimming!");
            }
        };
    }
}

// 运行结果:Swimming!

对于接口,和抽象类的使用是一样的。


也就是说,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run(){
                System.out.println("你好,匿名内部类!");
            }
        }
        thread.start();
    }
}

// 运行结果:你好,匿名内部类!

注意事项

  • 使用匿名内部类时,必须是继承一个类或者实现一个接口,但是两者不可兼得。
  • 匿名内部类中不能定义构造函数。
  • 匿名内部类中不能存在任何的静态成员变量和静态方法。
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

猜你喜欢

转载自blog.csdn.net/RabitMountain/article/details/78588222