软件编程
位置:首页>> 软件编程>> java编程>> 简单谈谈java中匿名内部类构造函数

简单谈谈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。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com