Java中的匿名内部类

在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码。就像下面这样。

Runnable x = new Runnable() {  

    public void run() {  
        System.out.println(this.getClass());  
    }  
};  
x.run();

实际上这是一个匿名内部类.

一个匿名类由以下几个部分组成:

  • new操作符
  • Runnable:接口名称。这里还可以填写抽象类、普通类的名称。
  • ():这个括号表示构造函数的参数列表。由于Runnable是一个接口,没有构造函数,所以这里填一个空的括号表示没有参数。
  • {…}:大括号中间的代码表示这个类内部的一些结构。在这里可以定义变量名称、方法。跟普通的类一样。

访问权限

  • 访问外层Class里面的字段。
  • 访问外层方法中的本地变量。除非变量是final
  • 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。

匿名类里面不可以有的东西:
1.不能定义静态初始化代码块(Static Initializer)。比如下面的代码是不符合语法的:

public class A {  
    public void test() {  
        Runnable r = new Runnable() {  
            static { System.out.println("hello"); }  
        };  
    }  
}

2.不能在匿名类里面定义接口。

比如:

public class A {  
    public void test() {  
        Runnable r = new Runnable() {  
            public interface Hello { };  
        };  
    }  
}

和上面一样,也是为了语义的清晰。interface只能定义静态的。

3.不能在匿名类中定义构造函数。

public class A {  
    public void test() {  
        Runnable r = new Runnable() {  
            public Runnable() { }  
        };  
    }  
}

匿名类通常用来简化代码,如

 private MinPQ<SearchNode> minPQ = new MinPQ<SearchNode>(new Comparator<SearchNode>() {  
        public int compare(SearchNode o1, SearchNode o2) {  
            if (o1.priority < o2.priority) return -1;  
           else if (o1.priority == o2.priority) return 0;  
           else return 1;  
        }  
    });  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值