0
点赞
收藏
分享

微信扫一扫

Java--匿名内部类--使用场景/实例

落拓尘嚣 2022-02-02 阅读 96

原文网址:Java--匿名内部类--使用场景/实例_IT利刃出鞘的博客-CSDN博客

简介

        本文用示例介绍Java中匿名内部类的一些使用场景。

        这些场景包括:多线程、接口。(实际上本处介绍的多线程中的new Runnable(){}也属于接口)。

多线程

简介 

        在Java多线程中可以通过实现Runnable接口来开发多线程:implements Runnable。对齐进行变形,可以使用匿名内部类:的直接new Runnable(){}。

实例 

package com.cph.Thread;
 
public class Text2 {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                Sysem.out.println("I am new Runnable(){xxx}");
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

        这段代码不会出现什么问题,控制台会输出:I am new Runnable(){xxx}。

        但如果java基础扎实一点的朋友,就会疑问Runnable()是接口,我们都知道java的接口是不可以实例化的,但代码中的new Runnable(){xxx}确是实例化了,为什么? 接口和抽象类不可以实例化是对的,这个是java语法规范来的,而new Runnable(){}其实不是实例化Runnable接口来的,实际上是一种内部类的一种简写:

①首先构造了一个”implements Runnable “的无名local内部类(方法内的内部类)
②然后构造了这个无名local内部类的一个实例
③然后用Runnable来表示这个无名local内部类的type(OO多态)。 例如上面这段代码编译后你会看到其实是编译了两个类来的,如下: 

这里写图片描述

        其中Text2$1就是无名local内部内类,这个也就很好地解释了为什么在main()方法中new Runnable(){xxx}里面的调用main()方法中的变量的时候要用final关键字来修饰。 上面只是借助new Runnable(){xxx}特例来说明接口在方法中new的机制,对其他接口同理可得。 

        匿名内部类(Anonymous Inner Class),在创建实例的同时给出类的定义,所有这些在一个表达式中完成。

接口

说明

可以使用匿名内部类的方式来实现接口。

实例

package org.example.a;

interface MyInterface<A, B>{
    public void test1(String str, A a);
    public void test2(B b);
}

class MyInterfaceImpl1<A, B> implements MyInterface<A, B> {
    @Override
    public void test1(String str, A a) {
        System.out.println("MyInterfaceImpl1 test1: " + str + a);
    }

    @Override
    public void test2(B b) {
        System.out.println("MyInterfaceImpl1 test2: " + b);
    }
}

class MyInterfaceImpl2 implements MyInterface<Integer, String> {
    @Override
    public void test1(String str, Integer a) {
        System.out.println("MyInterfaceImpl2 test1: " + str + a);
    }

    @Override
    public void test2(String b) {
        System.out.println("MyInterfaceImpl2 test2: " + b);
    }
}

public class Demo {
    public static void main(String[] args) {
        //匿名内部类写法
        MyInterface myInterface = new MyInterface<Integer, String>() {
            @Override
            public void test1(String str, Integer integer) {
                System.out.println("Anonymous test1: " + str + integer);
            }

            @Override
            public void test2(String str) {
                System.out.println("Anonymous test2: " + str);
            }
        };
        myInterface.test1("hello", 3);
        myInterface.test2("world");

        MyInterface<Integer, String> myInterface1 = new MyInterfaceImpl1<>();
        myInterface1.test1("hi", 4);
        myInterface1.test2("Tony");

        MyInterface myInterface2 = new MyInterfaceImpl2();
        myInterface2.test1("hhh", 5);
        myInterface2.test2("Stark");
    }
}

运行结果

Anonymous test1: hello3
Anonymous test2: world
MyInterfaceImpl1 test1: hi4
MyInterfaceImpl1 test2: Tony
MyInterfaceImpl2 test1: hhh5
MyInterfaceImpl2 test2: Stark
举报

相关推荐

0 条评论