在一个类A内部定义类B, B是非static类,那么B叫做非静态内部类,A叫做B的外部类。
在一个类A内部定义类C, C是static类,那么C叫做静态内部类,A叫做C的外部类。
非静态内部类B:
1在外部类A非静态方法中可以直接实例化内部类B.
2.内部类B可以直接访问外部类A的属性(成员变量)或方法。
3.其它类D引用内部类B的语法 A.B b=A实例.new B(); //前提是B对于D是可见的。
4. 内部类B内部默认持有外部类实例的引用: 外部类A.this 。 一个外部类A实例 new出来的多个B实例,那么所有B实例共享这个外部类实例。
静态内部类C:
1.在外部类A方法中可以直接实例化内部类C.
2.内部类C不可以直接访问外部类A的非静态属性(成员变量)或方法。
3.其它类D引用内部类C的语法与普通类一样: C c = new C(); //前提是C对于D是可见的。
匿名内部类:
1 匿名内部类在代码块内实例化,可以调用父类构建器
2.匿名内部类可以覆盖或实现父类的方法。
3.内部类B可以直接访问外部类A的属性(成员变量)或方法。
4 匿名内部类还可以引用代码块内的可见的局部变量(含方法参数),但局部变量必须是final的。
内部类一般的使用场景:仅为外部类服务,对于其它类不可见。
public class A {
private String name = "hello";
class B{//非静态内类部
void print(){
System.out.print("B.print A.name="+name);//引用外部类属
}
public A getA(){
return A.this;//默认持有外部类实例的引用
}
}
static class C {//静态内部类
//int cName = name; 编译出错,静态内部类不可以引用外部类的非静态属性或方法
}
public void test(String threadName){
final int num =0;
Thread thread = new Thread( threadName){//匿名类调用父类构建器
int total =num;//引用方法内局部变量
String aName = name;//引用方法内final局部变量
@Override
public void run() {//覆盖父类方法
// TODO Auto-generated method stub
super.run();
}
};
}
public void printB(){
B b = new B();//外部类可以直接实例化内部类
b.print();
}
public static void main(String args ){
A a = new A();
A.B b = a.new B();//其它类或静态方法实例化 非静态内部类
a = b.getA();
C c = new C();//其它类或静态方法可以按普通方式实例化静态内部类
}
}