匿名内部类看了半天真心看不懂,不知如何理解,如何更好的应用,还要它是否属于内部类的一种,和成员内部类以及局部内部类有什么区别。
匿名类对于Java来说,它主要用于传一个方法给一个函数。
在C++里面,我们直接传函数指针就可以了,在C#里面,我们可以用委托表示方法。
但是Java是一种臃肿和不合逻辑的语言,它没有这样的语法支持。于是为了传一个函数,我们不得不传一个拥有这个函数原型接口的类,里面包着这个函数。
于是Java里面出现了很多只有一个方法的接口,比如Runnable。
为了传一个方法不得不定义一个类显得实在麻烦,Java为了弥补语言的缺陷不得不又引入了新的无谓的概念,那就是匿名类,它从某种程度上来说为了简化定义一个其实只为了包装方法而只用到一次的类型。
为什么匿名呢?因为它只用到一次。我们用“匿名变量”来类比。
比如说
int add(int x, int y)
{
...
}
我们可以写
int x = 1;
int y = 2;
int result = Add(a, y);
也可以写
int result = Add(1, 2);后者我们只看到了字面值1, 2,没有变量名,它们相当于“匿名”的。
为什么我们不给它们名字呢?因为它们纯粹是作为Add的参数传进去的,而自身如果在别处不用的话,这么写显得比较简单,仅此而已。
http://www.iteye.com/topic/442435
匿名内部类、成员类与局部类
今天看代码,看到几个概念:内部类、局部类、成员类、静态成员类、匿名内部类;瞬间有种被搞糊涂了感觉。下面是一个小例子来对它们进行说明:
[java] view plaincopyprint?
public class ClassTest{
public static void main(String[] args) {
ClassTest son = new ClassTest();
//测试匿名类
son.testAnonymous(new AnonymousClass() {
@Override
public void test() {
System.out.println("1 -> " + this.getClass().isMemberClass());
System.out.println("1 -> " + this.getClass().isAnonymousClass());
System.out.println("1 -> " + this.getClass().isLocalClass());
System.out.println("---------------------------------------");
}
});
//测试成员类
son.testMember();
//测试静态成员类
new StaticMemberClass();
//测试局部类
class LocalClass{
public LocalClass(){
System.out.println("4 -> " + this.getClass().isMemberClass());
System.out.println("4 -> " + this.getClass().isAnonymousClass());
System.out.println("4 -> " + this.getClass().isLocalClass());
System.out.println("---------------------------------------");
}
}
new LocalClass();
}
private void testAnonymous(AnonymousClass inner) {
inner.test();
}
private void testMember() {
new MemberClass();
}
/**
* 接口,用于测试内部类
* @author xinghzhang
*
*/
interface AnonymousClass{
public void test();
}
/**
* 静态成员类
* @author xinghzhang
*
*/
static class StaticMemberClass{
public StaticMemberClass() {
System.out.println("3 -> " + this.getClass().isMemberClass());
System.out.println("3 -> " + this.getClass().isAnonymousClass());
System.out.println("3 -> " + this.getClass().isLocalClass());
System.out.println("---------------------------------------");
}
}
/**
* 成员类
* @author xinghzhang
*
*/
class MemberClass{
public MemberClass() {
System.out.println("2 -> " + this.getClass().isMemberClass());
System.out.println("2 -> " + this.getClass().isAnonymousClass());
System.out.println("2 -> " + this.getClass().isLocalClass());
System.out.println("---------------------------------------");
}
}
}
详见以下链接
http://blog.csdn.net/zhgxhuaa/article/details/36201703
匿名内部类 ( 明白了匿名类就理解了函数回调,(此处与线程无关))有位老兄说:(匿名一是为了简化代码,而是告诉GC我这个对象只用一次,用完给我回收了)
关于JAVA内部类:一个内部类的定义是定义在另一个类内部的类。
存在它的原因是:
1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
3.匿名内部类可以很方便的定义回调。
4.使用内部类可以非常方便的编写事件驱动程序。