Java匿名内部类

J a v a 匿 名 内 部 类 \huge{Java匿名内部类} Java

匿名内部类

①. 概念(定义)

通俗一点来讲匿名内部类就是没有名字的局部内部类
注意这里的两点:

  1. 没有名字
  2. 局部内部类

②. 作用

方便创建子类的对象,最终的目的是简化代码的编写。

具体方便再哪里呢?
比方说有一个方法进行调用的时候需要传入一个对象作为参数,这个时候就需要首先写一个类,然后创建一个对象,之后再把对象传进去一共三步。非常麻烦,但是匿名内部类就支持直接将这个类创建在参数中,并且这个类创建了之后直接生成一个对象,就相当于传入了一个对象,省去了大量的繁琐步骤。

③. 格式

Java匿名内部类_第1张图片

Employee a = new Emloyee(){
	//匿名内部类的类的结构体
	public void work(){
	
	}
}

④. ❗❗特征

这两个特征非常的重要:

  1. 匿名内部类是一个没有名字的内部类,同时也代表一个对象,或者换句话说匿名内部类定义之后会产生一个相应类型的对象!(这就是为什么传递参数的时候直接定义匿名内部类就可以了不用重新创建对象了)
  2. 匿名内部类产生的对象类型,相当于是当前new的那个类型的子类类型。
    示例:
public class Test {
    public static void main(String[] args) {
        Animal a = new Animal(){
        	//匿名内部类定义
            @Override
            public void run() {
                System.out.println("老虎跑的块~~~");
            }
        };
        a.run();
    }
}

//抽象类
abstract class Animal{
    public abstract void run();
}

上面代码借助下面的抽象类Animal进行定义匿名内部类,这行代码:

 Animal a = new Animal(){

右边写的是Animal类,但是实际上a真正的类型就是Animal类吗?
一定不是!
因为Animal是抽象类,一定不可以产生对象!!!!
❗❗❗所以匿名内部类所产生的对象,一定不是new的类型的对象,但是这个类又可以直接赋值给new类型的对象(左边),这个对象只能是new类型的子类对象!

⑤. 常见用途

匿名内部类就是作为一个对象,直接传输给方法的。
示例:

//实现原理
//有一个游泳接口,还有一个Swimming方法,需要让老师、学生、运动员去使用Swimming方法进行游泳
//但是不想创建一个学生对象、一个老师对象、一个运动员对象之后在分别进行调用,实在是麻烦
//直接使用匿名内部类,在创建对象的时候直接创建不同的匿名内部类,然后分别重写swim方法即可
public class Test2 {
    public static void main(String[] args) {
    	
    	//学生的匿名内部类
        Swimming s = new Swimming() {
            @Override
            public void swim() {
                System.out.println("学生快乐的自由泳‍");
            }
        };
        go(s);
		
		
        System.out.println("--------------");

		//老师的匿名内部类
        Swimming s1 = new Swimming() {
            @Override
            public void swim() {
                System.out.println("老师泳的贼快~~~~~");
            }
        };
        go(s1);

        System.out.println("--------------");


		//运动员的匿名内部类
        go(new Swimming() {
            @Override
            public void swim() {
                System.out.println("运动员的贼快啊~~~~~");
            }
        });


    }

    /**
       学生 老师 运动员可以一起参加游泳比赛
     */
    public static void go(Swimming s){
        System.out.println("开始。。。");
        s.swim();
        System.out.println("结束。。。");
    }
}


//定义一个游泳接口,所有实现了该接口的人都要会游泳!
interface Swimming{
    void swim();
}

从上面的代码可以看出来,匿名内部类创建出来大多是就是为了当前的立刻使用能比较方便。

⑥. 总结

匿名内部类,没有名字,基本就是创建出来为了当调用方法的参数,创建出来的类属于new类型对应的子类,并且匿名内部类定义之后就会产生一个相应类型的对象,匿名内部类的使用目的就是简化代码。

你可能感兴趣的:(Java,java,jvm,开发语言)