JavaSE——内部类(匿名内部类)

概述

匿名内部类 :是内部类的简化写法。他是一个隐含了名字的内部类。开发中,最常用到的内部类就是匿名内部类了。

 格式

new 类名或者接口名() {
     重写方法;
};

包含了:

  • 继承或者实现关系

  • 方法重写

  • 创建对象

所以从语法上来讲,这个整体其实是匿名内部类对象

 什么时候用到匿名内部类

实际上,如果我们希望定义一个只要使用一次的类,就可考虑使用匿名内部类。匿名内部类的本质作用

是为了简化代码

之前我们使用接口时,似乎得做如下几步操作:

  1. 定义子类

  2. 重写接口中的方法

  3. 创建子类对象

  4. 调用重写后的方法

interface Swim {
    public abstract void swimming();
}
​
// 1. 定义接口的实现类
class Student implements Swim {
    // 2. 重写抽象方法
    @Override
    public void swimming() {
        System.out.println("狗刨式...");
    }
}
​
public class Test {
    public static void main(String[] args) {
        // 3. 创建实现类对象
        Student s = new Student();
        // 4. 调用方法
        s.swimming();
    }
}

我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。

 匿名内部类前提和格式

匿名内部类必须继承一个父类或者实现一个父接口

匿名内部类格式

new 父类名或者接口名(){
    // 方法重写
    @Override 
    public void method() {
        // 执行语句
    }
};
 

使用方式

package com.zhao.innerclassdemo2;

public abstract class Animal {
    public abstract void eat();
}
package com.zhao.innerclassdemo2;

public interface Swim {
    public abstract void swim();
}
package com.zhao.innerclassdemo2;

public class Test {
    public static void main(String[] args) {
        //new出来的是匿名内部类的一个对象并且继承了Animal父类
        //因为Animal是一个抽象类所以在内部类中要重写抽象方法
        new Animal(){
            //下面这块才是匿名内部类
            @Override
            public void eat() {
                System.out.println("重写了eat()方法");
            }
        };//这个;分号不能省 实际上是new Animal(){};大括号中才是内部类

        //new出来的实际上是一个实现了Swim()接口的匿名内部类
        //因为这个内部类对象实现了Swim接口,所以要重写接口内的抽象方法
        new Swim(){
            @Override
            public void swim() {
                System.out.println("重写了接口游泳的方法");
            }
        };//同样;分号不能省
    }
}

匿名内部类的特点

  1. 定义一个没有名字的内部类

  2. 这个类实现了父类,或者父类接口

  3. 匿名内部类会创建这个没有名字的类的对象

匿名内部类的使用场景

通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。代码如下:

interface Swim {
    public abstract void swimming();
}
​
public class Demo07 {
    public static void main(String[] args) {
        // 普通方式传入对象
        // 创建实现类对象
        Student s = new Student();
        
        goSwimming(s);
        // 匿名内部类使用场景:作为方法参数传递
        Swim s3 = new Swim() {
            @Override
            public void swimming() {
                System.out.println("蝶泳...");
            }
        };
        // 传入匿名内部类
        goSwimming(s3);
​
        // 完美方案: 一步到位
        goSwimming(new Swim() {
            public void swimming() {
                System.out.println("大学生, 蛙泳...");
            }
        });
​
        goSwimming(new Swim() {
            public void swimming() {
                System.out.println("小学生, 自由泳...");
            }
        });
    }
​
    // 定义一个方法,模拟请一些人去游泳
    public static void goSwimming(Swim s) {
        s.swimming();
    }
}
 
 
posted @ 2023-03-08 02:11  SuzukiHane  阅读(34)  评论(0)    收藏  举报