内部类

java内部类

1,非私有 非静态内部类
例:outer.inner demo = new outer().new inner()
2,非私有 静态内部类
访问非静态成员:例:outer.inner demo = new outer.inner()
demo.show();
访问静态成员: 例:outer.inner.show();

非静态内部类中的静态方法是不被允许的
原因:静态方法不需要new就可以使用,
但是非静态内部类必须new才能使用。违背了原则。
非静态内部类中可以定义静态常量!必须使用final
例如:static final int num = 5;
原因:当编译完以后,其实num在字节码文件中就变成5了,不是变量。

内部类在外部类中的情况

编译后产生的文件名称:outer$inner //此处若带数字代表是局部内部类
举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class outer
{

Object ob;
public void method()
{
final int x = 5;//强调!!!此处必须加final!!!
class inner
{
void show()
{
System.out.println(x);
}
}
inner in = new inner();
in.show();
ob = in;//用ob保存下in保存的对象地址,
//等method结束以后,in消失,但对象还在,用ob保存了
//同理,如果不用final定义常量,那么等到method方法结束
//用ob调用show方法就找不到x了,所以JAVA中不允许编译通过!
}
}

总结:局部内部类只能访问被final修饰的局部变量

匿名内部类

匿名内部类其实就是子类

前提:内部类需要继承或者实现外部的类或者接口

格式:new 父类/接口名 ()
{
子类的内容
}

调用例子:
abstrcat class Demo
{ abstrcat void show();}

class outer
{
   public void method()
   {
       new Demo()
        {
           public void show()
           {
             System.out.println("show");
            }
         }.show//从此处直接调用show
    }
 }

 当多方法时候可以直接 Demo a = new Demo(){........
                                          }
                     然后a.show1;a.show2;