简单谈谈java中匿名内部类构造函数

作者:hebedich 时间:2021-09-08 18:54:10 

先看看下面的代码能不能编译通过:


public static void main(String[] args) {
List l1 = new ArrayList();
List l2 = new ArrayList(){};
List l3 = new ArrayList(){{}};
System.out.println(l1.getClass() == l2.getClass() );
System.out.println(l2.getClass() == l3.getClass() );
System.out.println(l1.getClass() == l3.getClass() );
}

答案是能通过编译,输出3个false。l1很容易理解,就是声明了一个

ArrayList对象,那么l2、l3是什么呢?

l2是一个匿名类内部类对象,继承ArrayList;

l3语句有些古怪,带了两个大括号,其实我们这样写就会明白了,这也是一个匿名内部类的定义,它的代码类似如下:


class Sub extends ArrayList {
{
//初始化代码块
}
}
List l3 = new Sub();

看到了吧,就是多了一个初始化代码块而已,起到构造函数的功能。当然一个类中的构造代码块可以有多个,下面的代码是可以编译的:

List l4 = new ArrayList(){{}{}{}};

匿名内部类虽然可以用一个初始化代码块来充当构造函数,但其构造函数还是进行了特殊的处理,它在初始化时直接调用父类的同参构造函数,然后在调用自己的代码块,例如:


List l5 = new ArrayList(5){
{
System.out.println("我是匿名内部类");
}
};

等价于:


class Sub extends ArrayList{
{
System.out.println("我是匿名内部类");
}
Sub(int num){
super(num);
}
}
List l5 = new Sub(5);

我们来看段示例代码


package testtest;

public class Main {

public static void main(String[] args) {
   InnerTest inner = new InnerTest();
   Test t = inner.get(3);
   System.out.println(t.getI());
 }
}

class Test {

private int i;

public Test(int i) {
   this.i = i;
 }

public int getI() {
   return i;
 }
}

class InnerTest {

public Test get(int x) {
   return new Test(x) {

@Override
     public int getI() {
       return super.getI() * 10;
     }
   };
 }
}

编译之后得到4个class文件:Test.class,InnerTest.class,InnerTest$1.class以及Main.class。容易看出来,Main.class是测试类的class文件,Test.class是超类Test的class文件,InnerTest.class是InnerTest 的class文件,最值得关注的就是匿名内部类的class文件InnerTest$1.class。

标签:java,匿名内部类,构造函数
0
投稿

猜你喜欢

  • Java Spring MVC 上传下载文件配置及controller方法详解

    2023-11-22 04:13:59
  • Java中静态代码块、构造代码块、构造函数和普通代码块的区别

    2023-11-25 10:09:06
  • 如何在MyBatis中实现DataSource

    2021-11-29 13:49:48
  • Java 关于递归的调用机制精细解读

    2023-01-17 04:42:41
  • C#面向对象设计原则之里氏替换原则

    2022-08-27 23:59:22
  • Java面试必备之ArrayList陷阱解析

    2023-02-16 18:14:26
  • WinForm中实现picturebox自适应图片大小的方法

    2022-09-07 21:14:01
  • c++中的string常用函数用法总结

    2023-11-02 16:44:02
  • Android 消息机制以及handler的内存泄露

    2023-08-01 07:59:44
  • JNI语言基本知识

    2022-01-20 20:02:46
  • flutter 路由跳转的实现示例

    2023-08-23 14:55:26
  • java Wrapper类基本用法详解

    2022-12-20 18:20:05
  • springmvc前台向后台传值几种方式总结(从简单到复杂)

    2023-04-13 22:20:50
  • Java如何在临界区中避免竞态条件

    2022-11-02 09:39:29
  • Go Java算法之K个重复字符最长子串详解

    2022-02-10 17:53:29
  • Java中基于Shiro,JWT实现微信小程序登录完整例子及实现过程

    2023-07-05 15:01:42
  • C# Console利用mspaint打开图像并保存的方法

    2023-07-05 16:15:43
  • AJAX中Get请求报错404的原因以及解决办法

    2021-07-03 05:41:07
  • Java JDBC导致的反序列化攻击原理解析

    2023-09-24 15:38:42
  • 字符串替换Replace仅替换第一个字符串匹配项

    2021-10-02 17:36:56
  • asp之家 软件编程 m.aspxhome.com