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
                    
                
                
            
        
浙公网安备 33010602011771号