定义:隐藏实现细节的内部类,而不像其他类,可以任意调用构造器创建实例(有构造器权限)。
特点:
1、默认继承或实现某个类(Object不算)。
public void testMethod() {
//匿名内部类,它继承了类Test2
new Test2() {
};
}
/**
* 内部类
* @author Administrator
*
*/
class Test2 {
public void test() {
// ......
}
}
当把test2改为final时,它不可被继承。所以以它实现匿名内部类会有编译错误,从这也佐证了匿名内部类会继承或实现那个new 关键字后面的那个类(接口)。
public void testMethod() {
//匿名内部类,它继承了类Test2
//<span style="color:#ff6666;">这里有编译错误,提示final类不可被继承
</span> new Test2() {
};
}
/**
* 内部类
* @author Administrator
*
*/
final class Test2 {
public void test() {
// ......
}
}
2、匿名内部类可以直接构建接口的实例,并实现方法细节
public void testMethod() {
//直接创建接口的实例
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
};
}
3、匿名内部类可以访问外部类的私有成员属性
public class Synchronized {
final private String string = "hello";
public void testMethod() {
//直接创建接口的实例
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
String ss = string;
}
};
}
/**
* 内部类
* @author Administrator
*
*/
final class Test2 {
public void test() {
// ......
}
}
}
4、JDK 1.8之后内部类访问方法局部变量时,final关键字可以省略,但是它在内部类里面还是默认是final的,不能改变值或引用
public void testMethod(String str) {
//没有关系,不在内部类里面,此时不会认为是final
str = "1";
//直接创建接口的实例
new Runnable() {
@Override
public void run() {
//<span style="color:#ff0000;">编译错误,提示str是final变量,不可改变</span>
str = "";
}
};
}