首页 > 开发 > Java > 正文

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

2024-07-13 09:56:02
字体:
来源:转载
供稿:网友

这篇文章主要简单给我们介绍了java中匿名内部类构造函数,并附上了简单的示例,有需要的小伙伴可以参考下。

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

 

 
  1. public static void main(String[] args) { 
  2. List l1 = new ArrayList(); 
  3. List l2 = new ArrayList(){}; 
  4. List l3 = new ArrayList(){{}}; 
  5. System.out.println(l1.getClass() == l2.getClass() ); 
  6. System.out.println(l2.getClass() == l3.getClass() ); 
  7. System.out.println(l1.getClass() == l3.getClass() ); 

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

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

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

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

 

 
  1. class Sub extends ArrayList { 
  2. //初始化代码块 
  3. List l3 = new Sub(); 

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

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

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

 

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

等价于:

 

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

我们来看段示例代码

 

 
  1. package testtest;  
  2.  
  3. public class Main {  
  4.  
  5. public static void main(String[] args) {  
  6. InnerTest inner = new InnerTest();  
  7. Test t = inner.get(3);  
  8. System.out.println(t.getI());  
  9. }  
  10. }  
  11.  
  12. class Test {  
  13.  
  14. private int i;  
  15.  
  16. public Test(int i) {  
  17. this.i = i;  
  18. }  
  19.  
  20. public int getI() {  
  21. return i;  
  22. }  
  23. }  
  24.  
  25. class InnerTest {  
  26.  
  27. public Test get(int x) {  
  28. return new Test(x) {  
  29.  
  30. @Override 
  31. public int getI() {  
  32. return super.getI() * 10;  
  33. }  
  34. };  
  35. }  

编译之后得到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教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表