Java中定义了多少种类型的匿名内部类?


一个**匿名内部类**是一个根本**没有类名**声明的内部类。换句话说,一个无名内部类被称为**匿名内部类**。因为它没有名称,所以它不能有**构造函数**,因为我们知道构造函数名称与类名相同。

我们可以同时定义一个**匿名内部类**并使用**new**运算符创建其对象,一步完成。

语法

new(argument-list){
   // Anonymous class body
}

Java中匿名内部类的类型

  • 扩展类的匿名内部类
  • 实现接口的匿名内部类
  • 作为参数的匿名内部类

扩展类的匿名内部类

这里使用**new**关键字创建**匿名内部类**的对象,该对象具有**父类类型的引用**。

示例

在线演示

class Car {
   public void engineType() {
      System.out.println("Turbo Engine");
   }
}
public class AnonymousClassDemo {
   public static void main(String args[]) {
      Car c1 = new Car();
      c1.engineType();
      Car c2 = new Car() {
         @Override
         public void engineType() {
            System.out.println("V2 Engine");
         }
      };
      c2.engineType();
   }
}

输出

Turbo Engine
V2 Engine


实现接口的匿名内部类

这里使用**new**关键字创建**匿名内部类**的对象,该对象具有**接口类型的引用**。

示例

在线演示

interface Software {
   public void develop();
}
public class AnonymousClassDemo1 {
   public static void main(String args[]) {
      Software s = new Software() {
         @Override
         public void develop() {
            System.out.println("Software Developed in Java");
         }
      };
      s.develop();
      System.out.println(s.getClass().getName());
   }
}

输出

Software Developed in Java
AnonymousClassDemo1$1


作为参数的匿名内部类

我们可以使用**匿名内部类**作为参数,以便将其**传递给方法或构造函数**。

示例

在线演示

abstract class Engine {
   public abstract void engineType();
}
class Vehicle {
   public void transport(Engine e) {
      e.engineType();
   }
}
public class AnonymousInnerClassDemo2 {
   public static void main(String args[]) {
      Vehicle v = new Vehicle();
      v.transport(new Engine() {
         @Override
         public void engineType() {
            System.out.println("Turbo Engine");
         }
      });
   }
}

输出

Turbo Engine

更新于:2020年2月11日

1K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告