Java--匿名内部类

匿名内部类:是内部类的简化写法。它的本质是一个带具体实现的父类或者父接口的匿名的子类对象,开发中最常用的就是匿名内部类。

1. 步骤

正常定义类的步骤:

  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 Demo07 {
    public static void main(String[] args) {
        // 3. 创建实现类对象
        Student s = new Student();
        // 4. 调用方法
        s.swimming();
    }
}

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

匿名内部类前提

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

匿名内部类格式

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

使用方式

以接口为例,匿名内部类的使用,代码如下:
创建匿名内部类,并调用:

interface Swim {
    public abstract void swimming();
}
// 1. 定义接口的实现类
class Student implements Swim {
    // 2. 重写抽象方法
    @Override
    public void swimming() {
        System.out.println("狗刨式...");
    }
}
public class Demo07 {
    public static void main(String[] args) {
        // 使用匿名内部类
new Swim() {        
@Override            
public void swimming() {            
System.out.println("自由泳...");                
}            
}.swimming();        
        // 接口 变量 = new 实现类(); // 多态,走子类的重写方法
        Swim s2 = new Swim() {
            @Override
            public void swimming() {
                System.out.println("蛙泳...");
            }
        };
        s2.swimming();
        s2.swimming();
    }
}

匿名内部类的本质

  1. 定义一个没有名字的内部类
  2. 这个类实现了Swim接口
  3. 创建了这个没有名字的类的对象

匿名内部类的作用

简化代码

匿名内部类的使用场景

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

interface Swim {
    public abstract void swimming();
}
// 1. 定义接口的实现类
class Student implements Swim {
    // 2. 重写抽象方法
    @Override
    public void swimming() {
        System.out.println("狗刨式...");
    }
}
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();
    }
}

end

匿名内部类可以引申成为‘入‘表达式‘入‘表达式也可以简化到方法引用,后文会一一介绍,谢谢您的阅读!

发布了228 篇原创文章 · 获赞 315 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/Luojun13Class/article/details/84639750