Java 匿名类

Java匿名类相当于在定义类的同时再新建这个类的实例,一个类可以包含另一个称为嵌套类的类,可以在不提供任何名称的情况下创建嵌套类,没有任何名称的嵌套类称为匿名类。

必须在另一个类中定义一个匿名类。因此,它也被称为匿名内部类。

匿名类的语法

Runnable hello = new Runnable() {  
    public void run() {  
        System.out.println("hello");  
    }  
};

一个匿名类由以下几个部分组成:

  • new操作符

  • Runnable:接口名称。这里还可以填写抽象类、普通类的名称。

  • ():这个括号表示构造函数的参数列表。由于Runnable是一个接口,没有构造函数,所以这里填一个空的括号表示没有参数。

  • {...}:大括号中间的代码表示这个类内部的一些结构。在这里可以定义变量名称、方法。跟普通的类一样。

示例:匿名内部类继承类

class Polygon {
   public void display() {
      System.out.println("在Polygon类内");
   }
}

class AnonymousDemo {
   public void createClass() {

      //创建匿名类,继承类Polygon
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("匿名类的内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
       AnonymousDemo an = new AnonymousDemo();
       an.createClass();
   }
}

输出结果

匿名类的内部。

在上面的示例中,我们创建了一个类Polygon。它只有一个方法display()。

然后,我们创建了一个匿名类,该类继承类Polygon并重写了display()方法。

当我们运行该程序时,将创建一个匿名类的对象p1。然后该对象调用匿名类的display()方法。

示例:实现接口的匿名类

interface Polygon {
   public void display();
}

class AnonymousDemo {
   public void createClass() {

      //匿名类实现接口
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("匿名类的内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
      AnonymousDemo an = new AnonymousDemo();
      an.createClass();
   }
}

输出结果

匿名类的内部。

在上面的示例中,我们创建了一个实现该Polygon接口的匿名类。

匿名类的优点

对于类中方法较少,或者只使用一次的内部类用匿名内部类,代码会比较少,更直接一点。例如,

Object = new Example() {
   public void display() {
      System.out.println("匿名类重写display()方法。");
   }
};

在这里,当我们需要重写display()方法时,将动态创建匿名类的对象。

匿名类也有助于我们使代码简洁。

匿名类的缺点

使用有很多限制,如类中方法多的类匿名内部类表达式会很长,没有阅读性;或者是需要多次访问内部类的情况,就不适合。

编程笔记 » Java 匿名类