内部类
- 成员内部类
- 非静态内部类
- 静态内部类
- 匿名内部类
- 局部内部类
成员内部类
非静态内部类
- 内部类中可以直接访问外部类的成员,但外部类不能调用内部类中成员。
- 必须寄存于一个外部类对象,
- 非静态内部类,不能有静态方法、静态属性和静态初始化块。
public class TestInnerClass {
public static void main(String[] args) {
//调用内部对象
Outer.Inner in = new Outer().new Inner();
in.use();
}
}
class Outer{
private String name = "Tom";
public void test() {
}
class Inner{
String name = "jack";
public void use(){
String name = "Mark";
System.out.println("使用外部类的属性"+Outer.this.name);
System.out.println("内部类成员变量"+this.name);
System.out.println("局部变量:"+name);
}
}
}
静态内部类
- 静态内部类需要使用static修饰。
- 内部类中无法调用非静态的外部成员。
public class TestStaticInnerClass {
public static void main(String[] args) {
Outer2.Inner inn = new Outer2.Inner();
inn.use();
}
}
class Outer2{
static String name = "Tom";
public void test() {
}
static class Inner{
String name = "jack";
public void use(){
String name = "Mark";
//无法调用非静态的外部成员。
System.out.println("使用外部类的属性"+Outer2.name);
System.out.println("内部类成员变量"+this.name);
System.out.println("局部变量:"+name);
}
}
}
匿名内部类
- 适合只用于一次的类。例如全局计数的初始化。
public class TestAnonymousInner {
public static void test(A a) {
//在这里调用
a.a();
}
public static void main(String[] args) {
TestAnonymousInner.test(new A(){
@Override
public void a() {
// TODO Auto-generated method stub
System.out.println("堕落只是感受这世间的风霜");
}
});
}
}
interface A{
void a();
}
匿名内部类常用于监听等
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});