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

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

简介

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

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

多线程

简介 

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

实例 

  1. package com.cph.Thread;
  2. public class Text2 {
  3. public static void main(String[] args) {
  4. Runnable runnable = new Runnable() {
  5. @Override
  6. public void run() {
  7. Sysem.out.println("I am new Runnable(){xxx}");
  8. }
  9. };
  10. Thread thread = new Thread(runnable);
  11. thread.start();
  12. }
  13. }

        这段代码不会出现什么问题,控制台会输出: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),在创建实例的同时给出类的定义,所有这些在一个表达式中完成。

接口

说明

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

实例

  1. package org.example.a;
  2. interface MyInterface<A, B>{
  3. public void test1(String str, A a);
  4. public void test2(B b);
  5. }
  6. class MyInterfaceImpl1<A, B> implements MyInterface<A, B> {
  7. @Override
  8. public void test1(String str, A a) {
  9. System.out.println("MyInterfaceImpl1 test1: " + str + a);
  10. }
  11. @Override
  12. public void test2(B b) {
  13. System.out.println("MyInterfaceImpl1 test2: " + b);
  14. }
  15. }
  16. class MyInterfaceImpl2 implements MyInterface<Integer, String> {
  17. @Override
  18. public void test1(String str, Integer a) {
  19. System.out.println("MyInterfaceImpl2 test1: " + str + a);
  20. }
  21. @Override
  22. public void test2(String b) {
  23. System.out.println("MyInterfaceImpl2 test2: " + b);
  24. }
  25. }
  26. public class Demo {
  27. public static void main(String[] args) {
  28. //匿名内部类写法
  29. MyInterface myInterface = new MyInterface<Integer, String>() {
  30. @Override
  31. public void test1(String str, Integer integer) {
  32. System.out.println("Anonymous test1: " + str + integer);
  33. }
  34. @Override
  35. public void test2(String str) {
  36. System.out.println("Anonymous test2: " + str);
  37. }
  38. };
  39. myInterface.test1("hello", 3);
  40. myInterface.test2("world");
  41. MyInterface<Integer, String> myInterface1 = new MyInterfaceImpl1<>();
  42. myInterface1.test1("hi", 4);
  43. myInterface1.test2("Tony");
  44. MyInterface myInterface2 = new MyInterfaceImpl2();
  45. myInterface2.test1("hhh", 5);
  46. myInterface2.test2("Stark");
  47. }
  48. }

运行结果

  1. Anonymous test1: hello3
  2. Anonymous test2: world
  3. MyInterfaceImpl1 test1: hi4
  4. MyInterfaceImpl1 test2: Tony
  5. MyInterfaceImpl2 test1: hhh5
  6. MyInterfaceImpl2 test2: Stark

posted @ 2022-10-08 11:23  小陈子博客  阅读(296)  评论(0编辑  收藏  举报