java 内部类
1.内部类定义
直接包容于一个类或方法中的类,可以看成是外部类的成员,与其他成员同等地位
编译后,生成文件名如下
外部类$内部类.class
2.静态内部类
一个声明为static的内部类
class TopClass{
static class InnerClass{
public static void fun(){
}
}
}
静态内部类不能访问其外部类的对象的实例数据,但可以访问其静态成员(包容字段与方法)。
静态内部类,由于是”静态”的,所以,直接使用其类名就能直接调用其方法,存取其属性。
public class Test{
public static void main(String[] args){
TopClass.InnerClass.fun();
}
}
使用场景:当需要编写许多静态方法及静态字段时,将逻辑上密切相关的代码组织成静态内部类,是一种合理的代码管理方式。
3.成员内部类
声明为类成员的非静态类
class TopClass{
class InnerClass{
}
}
它可以访问外部类中的任何成员。反过来,外部类也可以访问内部类的任何成员,但父类必须首先创建内部类的实例
使用场景:当一个类要完成的功能比较多,并且这些功能从逻辑上看很明显地可以划分为几大类,则将这些 代码分别设计几个成员内部类是个不错的代码管理方式。 调用一个线程一般使用较多
4.本地内部类
在一个方法体中定义的类
void fun(){
class MyClass{
}
}
本地内部类在方法体内部定义一个类,然后实例化它,接着才能调用其方法,显得有些“多此一 举”,因此在实际开发中用得不多.
5.匿名内部类
看一个引例:
一个接口
interface MyInterface{
void fun();
}
有一个方法如下:
void showUsage(MyInterface obj){
obj.fun();
}
通常,我们需要创建一个类实现该接口,然后new一个对象才能调用该方法。
使用匿名内部类可以简化这个过程如下:
showUsage(new MyInterface(){
public void fun(){
//...
}
})
匿名内部类多用于创建一个实现了某接口的对象或派生自某抽象基类的对象,其特点是:这个对 象“仅用一次”
可视化GUI中大量使用匿名内部类
lambda表达式就是针对接口实现的匿名内部类的进一步简化
使用内部类好处:
我们希望以面向对象的方式封装某些信息为一个类,而这些信息仅在一个地方被另一个类(或方法)所使用,这时,创建一个“独立的”和“公开的”类是不必要的,而且它也不利于信息隐藏。因此,在这种场景下选择内部类是合适的。
参考:
金旭亮Java编程系列