Java--匿名内部类--使用场景/实例
原文网址: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
本文来自博客园,作者:小陈子博客,转载请注明原文链接:https://www.cnblogs.com/cj8357475/p/16768402.html