A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本篇中你可以了解到匿名内部类的使用、匿名内部类要注意的事项
一、匿名内部类的使用:
由于匿名内部类没有名字,所以创建格式比较特殊:
new 父类构造器(参数列表){
    匿名内部类的主体部分
}
new 接口(){
    匿名内部类的主体部分
}
使用匿名内部类我们必须要继承一个父类或者实现一个接口,并且只能继承一个父类或者实现一个接口。同时匿名内部类也没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象隐式的引用。/**
* @program:
* @description: 匿名内部类
* @author: 隔壁王叔叔
* @create: 2018-07-19 16:40
**/
abstract class Fish {
    private String name;

    public Fish() {
    }

    public Fish(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    abstract int swim();
}

public class Test {
    public static void testFish(Fish fish) {
        System.out.println(fish.getName() + "游了" + fish.swim() + "米");
    }

    public static void main(String[] args) {
        testFish(new Fish() {
            @Override
            int swim() {
                return 10000;
            }

            @Override
            public String getName() {
                return "鲲";
            }
        });
    }
}=======================OutPut:鲲游了10000米
在Test类中,testFish(Fish fish)方法接收了一个Fish类型的数据,但Fish类是一个抽象类,抽象类是没有办法通过new构造器的方式创建对象的,所以必须要先有实现类,才能通过new的方式创建抽象类的实现类的对象。所以,在main方法中直接使用匿名内部类的方式,相当于创建了一个抽象类的实现类的对象

由于匿名内部类不能是抽象类,所以它必须要实现它的抽象父类或者接口里面所有的抽象方法。

下面我们来将匿名内部类进行拆分:

首先,创建一个常规类来继承抽象类,并重写抽象父类中必须要重写的方法

class MyFish extends Fish{

    @Override
    int swim() {
        return 10000;
    }

    @Override
    public String getName() {
        return "鲲";
    }
}接下来,在main方法中,创建MyFish的对象,并将对象的引用作为testFish(Fish fish)方法的参数进行传递
MyFish myFish = new MyFish();
testFish(myFish);
匿名内部类存在一个缺陷:仅能被使用一次,使用匿名内部类时它会立即创建一个该类的对象,但并没有对应的变量来记录该类对象的引用,所以匿名内部类是不能够被重复使用。如果我们需要对testFish()方法里面传递的内部类进行多次使用,建议重新定义类来继承抽象类。
二、注意事项在使用匿名内部类的过程中,我们需要注意如下几点:

      1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

      2、匿名内部类中是不能定义构造函数。

      3、匿名内部类中不能存在任何的静态成员变量和静态方法。

      4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

      5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法


----by  隔壁王叔叔



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马