版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lonyness/article/details/78943808
详解匿名内部类
本文主要是根据我在看think in java时,对匿名内部类的相关理解及相关困惑解疑;在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始化匿名内部类、与及带形参的匿名内部类的相关使用及注意事项。
一、使用匿名内部类
误区一、以为匿名内部类完全不需要对类进行声明及定义,仅仅只要进行一个方法创建即可;使用匿名内部类是,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
此处并不是说匿名内部类就是说在方法内部返回一个定义声明类,而是说这个匿名内部类必须继承或者实现外部的类或接口;本意就是“传建一个继承自基类的内部引用并返回基类对象”;所以在外部声明该类的抽象类如下:
public abstract class Contents {
private int i;
public abstract void f();
}
该部分声明了匿名内部类的继承对象,而如下是整个匿名内部类的方法实现:
public class Excercise19 {
public Contents contents(){
return new Contents(){
private int i = 1;
public void f(){
System.out.println("i's result is "+i);
}
};
}
public static void main(String[] args) {
Excercise19 ex9 = new Excercise19();
Contents c = ex9.contents();
c.f();
}
}
--------------
Output:
i's result is 1
上述整个实现了一个返回匿名内部类的方法声明及内部类的方法调用,该内部类的方法是以下代码块的相关简写,本身是先声明一个继承Contents的实体类,然后对该实体类进行定义,再调用该实体类的方法,具体实现如下:
public class Excercise19b {
public Contents contents(){
return new Mycontents();
}
class Mycontents extends Contents{
private int i = 1;
@Override
public void f() {
System.out.println("my i's result is "+ i);
}
}
public static void main(String[] args) {
Excercise19b ex9 = new Excercise19b();
Contents c = ex9.contents();
c.f();
}
}
----------------
Output
my i's result is 1
二、注意事项:
在使用匿名内部类的过程中,我们需要注意如下几点:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中定义的构造函数无效。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。