Java匿名内部类

匿名内部类

           要讲匿名内部类首先要了解什么是内部类,内部类简单来说就是在某个类的内部又定义了一个类,没有名字的内部类就叫匿名内部类。匿名内部类因为没有名字,所以只能使用一次,主要用来简化代码,使用匿名内部类的一个前提条件是:必须继承一个父类或者实现一个接口。

匿名内部类的实现格式

格式一:
new 类A(){
     方法体
}
此时产生的是类A的子类对象,如果类A是只含有带参数构造方法的类,在括号里必须带上这些参数
格式二:
new 接口A(){
        方法体
}
此时产生的是接口A的实现对象

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

abstract class Fruit {
    public abstract void eat();
}
 
class Apple extends Fruit {
    public void eat() {
        System.out.println("can eat");
    }
}
 
public class Demo {
    public static void main(String[] args) {
        Fruit f = new Apple();
        f.eat();
    }
}
      可以看出,Apple类继承了抽象类Fruit,然后产生Apple的一个实例,将其向上转型为Fruit的引用,但是此时Apple类只使用一次,独立编写一个类比较麻烦。这时候就可以使用匿名内部类。

使用匿名内部类实现抽象方法

abstract class Fruit {
    public abstract void eat();
}
 
public class Demo {
    public static void main(String[] args) {
        Fruit f = new Fruit() {
            public void eat() {
                System.out.println("can eat");
            }
        };
        f.eat();
    }
}
        使用匿名内部类将抽象类Fruit的方法在大括号中实现,就可以省略一个类的书写。

在接口使用匿名内部类

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();
    }
}
      在接口上也可以使用匿名内部类,从上面几个例子可以看出,只要一个类是抽象的或是一个接口,那么其子类的方法都可以使用匿名内部类来实现,最常见的是在多线程的实现上,因为要实现多线程必须继承Tread类或继承Runnable接口。

使用匿名内部类注意事项:

       1、匿名内部类不能有构造方法,但是如果这个匿名内部类继承了一个只含有带参数构造方法的父类,在创建它的对象的时候,在括号中必须带上这些参数;
       2、匿名内部类不能定义任何静态成员和方法;
       3、匿名内部类不能被public、protect、private、static修饰;
       4、只能创建匿名内部类的一个实例。

匿名内部类的使用条件:

      1、只用到类的一个实例;
      2、类在定义后马上用到;
      3、类非常小。








你可能感兴趣的:(Java匿名内部类)