您的位置:首页 > 编程语言 > Java开发

Java匿名内部类学习

2017-03-25 09:59 302 查看

Java匿名内部类

匿名内部类基本知识与用法

匿名内部类,是一个没有类名的类,通常用在当一个继承父类或者实现接口的类只需要用一次的时候,用来简化代码编写。总结一下匿名内部类有几个基本点:

*继承父类或者实现接口或者实现抽象类

*匿名内部类用new来生成一个继承父类的对象的引用,因此可以用来作为参参数传递

*匿名内部类只能使用一次

利用代码来测试继承父类、实现接口、实现抽象类的用法

abstract class afather {
public abstract void eat();
}

class father {
public void eat(){
System.out.println("eat person");
}
}

interface ifather{
public void eat();
}

class Child extends father {
public void eat() {
System.out.println("eat child");
}
}

public class Test {
public static void main(String[] args) {
//非匿名内部类的用法
father fc = new Child();
fc.eat();

//继承父类的匿名内部类
father f = new father(){
public void eat(){
System.out.println("eat nonameinnerclass");
}
};
f.eat();

//实现抽象类的匿名内部类
afather af = new afather(){
public void eat(){
System.out.println("eat afather");
}
};
af.eat();

//实现接口的匿名内部类
ifather ifa = new ifather(){
public void eat(){
System.out.println("eat interface");
}
};
ifa.eat();
}

}


运行结果:

eat child

eat nonameinnerclass

eat afather

eat interface

利用代码测试匿名内部类作为参数传递

abstract class afathers {
public abstract void eat();
}

class others{
public void getafather(afathers a){
a.eat();
}
}

public class Test2 {
public static void main(String[] args) {
// 相当于传递了一个实现afathers类的子类的引用
new others().getafather(
new afathers(){
public void eat(){
System.out.println("eat");
}
}
);
}
}


一些注意事项

http://blog.csdn.net/chenssy/article/details/13170015(http://blog.csdn.net/chenssy/article/details/13170015)

在使用匿名内部类的过程中,我们需要注意如下几点:

1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

2、匿名内部类中是不能定义构造函数的。

3、匿名内部类中不能存在任何的静态成员变量和静态方法。

4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

2.内部类使用参数必须是final类型

原因:内部类并不是直接使用的外部的参数,而是编译时有自己单独的.class文件,也就是说它是拷贝了一份参数,为了避免参数改变,造成数据不一致,要求数据必须是final类型

参考:[]http://android.blog.51cto.com/268543/384844]

3.匿名内部类初始化

匿名内部类没有构造器,一般使用静态代码块来完成初始化操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: