简单谈谈java中匿名内部类构造函数
作者:hebedich 发布时间:2021-09-08 18:54:10
标签:java,匿名内部类,构造函数
先看看下面的代码能不能编译通过:
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。


猜你喜欢
- 本文实例讲述了Android中ListView下拉刷新的实现方法。分享给大家供大家参考,具体如下:ListView中的下拉刷新是非常常见的,
- 在开发中经常使用到Set集合去重,那么去重的原理是怎样实现的呢?在此文章记录一下去重原理!!!下面是set集合类图下面我们来跟踪一下执行过程
- 笔者计划为大家介绍分布式文件系统,用于存储应用的图片、word、excel、pdf等文件。在开始介绍分布式文件系统之前,为大家介绍一下使用本
- C# Path类—文件路径给定如下字符串类型filePath,表示一个文件路径:string filePath = &q
- 本文实例为大家分享了RecyclerView实现滑动删除的具体代码,供大家参考,具体内容如下package com.example.demo
- 什么是进程?当一个程序被打开运行时,它就是一个进程。在进程中包括线程,进程可以由一个或多个线程组成。什么是线程?线程是程序执行流的最小单元。
- 1、 尽量指定类的final修饰符 带有final修饰符的类是不可派生的。 如果指定一个类为final,则该类所有的方法都是final。Ja
- 一、前言之前介绍了JMeter engine启动原理,但是里面涉及到HashTree这个类结构没有给大家详细介绍,这边文章就详细介绍JMet
- 在Android开发中,往往要用到自定义的控件来实现我们的需求或效果。在使用自定义 控件时,难免要用到自定义属性,那怎么使用自定义属性呢?在
- 这篇文章主要介绍了spring cloud gateway请求跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如何控制S
- 先给大家这是下效果图:谷歌提供的v4包,ViewPager在布局文件中,先添加<android.support.v4.view.Vie
- 问题:在web里面用iframe连接一个html文件 - html文件里面是超链接 -&nb
- 一.方法的基本使用1.什么是方法方法是一个代码片段,类似于C语言中的函数2.方法基本语法基本语法 // 方法定义
- 详解HDFS多文件Join操作的实例最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:All Join以及常用的Left J
- 1.指针指针就是地址(即一个数据)。2.指针变量2.1概念(1)指针变量是变量,是变量在内存中就会开辟空间,会有自己对应的的地址,有自己的变
- QR 二维码中插入图片二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维
- 前言哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下
- 引言HDFS Balancer工具可以用来分析块的分布情况,并且可以重新分配DataNode中的数据。本文通过为您介绍如何使用HDFS Ba
- 本文实例讲述了C#控制图像旋转和翻转的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co