静态内部类 又叫 嵌套类
总结:
1、普通内部类(非嵌套类或非静态内部类) 不允许有 静态字段和方法2、静态内部类(嵌套类) 不能直接 访问外围类的 非静态成员 但可以通过外围类的对象去访问外围类的 非静态成员
3、创建普通内部类时,必须通过外围类对象,普通内部类(不含 嵌套类) 将隐式保存外围类对象的引用 所以 能透明(直接)访问外围类的所有成员(包括private) 通过 外围类名.this 访问这个 外围类对象
4、匿名内部类 内部若要使用 外部定义的对象 这个外部对象必须是final
5、匿名内部类 必须 继承一个类 或 实现一个接口
public class Test{
public static void main(String args[])
{
Test t=new Test();
C c=t.new C();//外围类的 静态方法中 创建普通内部类
c.fc(6);
System.out.println("t.c:"+t.c);
// c.fc1(7);
System.out.println();
D d=new D();
d.fd(6);
d.fd1(7);
System.out.println();
t.test();
}
void test(){
C c=new C();//外围类的 非静态方法中 创建内部类
c.fc(6);
// c.fc1(7);
System.out.println();
D d=new D();
d.fd(6);
d.fd1(7);
}
class C
{
int k1=0;
// static int k=0;//普通内部类(非嵌套类 即静态内部类) 不允许有 静态字段和方法
void fc(int s){
++c;
++cc;
System.out.println("普通内部类(非静态)Inner C_非静态方法fc:"+s);
f(c);
f1(cc);
}
//普通内部类(非嵌套类 即静态内部类) 不允许有 静态字段和方法
/*static void fc1( int s){
// ++Test.this.c;
// ++cc;
System.out.println("Inner C_静态方法fc1:"+s);
// f(c);
f1(cc);
}*/
}
static class D
{
int d=1;
static int d2=99;
void fd(int s){
System.out.println("静态Inner D_非静态方法fd:"+s);
++cc;
f1(cc);
Test t=new Test();
//++c;//静态内部类(嵌套类) 不能直接 访问外围类的 非静态成员
++t.c;// 不能直接访问 但可以通过外围类的对象去访问外围类的 非静态成员
t.f(t.c);//不能直接访问 但可以通过外围类的对象去访问外围类的 非静态成员
}
static void fd1(int s){
System.out.println("静态Inner D_静态方法fd1:"+s);
++cc;
f1(cc);
// ++c;//静态内部类(嵌套类) 不能直接 访问外围类的 非静态成员
// f(c);
}
}
int c=1;
static int cc=11;
void f(int s){
System.out.println("外围类Class Test非静态方法f:"+s);
}
static void f1(int s){
System.out.println("外围类Class Test.-静态方法f1:"+s);
}
}
class A{
public static void main(String args[]){
Test t=new Test();
Test.C c=t.new C();//其他类的 静态方法中 创建普通内部类
c.fc(6);
// c.fc1(7);
System.out.println();
Test.D d=new Test.D();//其他类的 静态方法中 创建静态内部类
d.fd(6);
d.fd1(7);
System.out.println();
A a=new A();
a.g();
}
void g(){
Test t=new Test();
Test.C c=t.new C();//其他类的 非静态方法中 创建普通内部类
c.fc(6);
// c.fc1(7);
System.out.println();
Test.D d=new Test.D();//其他类的 非静态方法中 创建静态内部类
d.fd(6);
d.fd1(7);
}
}