内部类
- 内部列方法可以访问该类定义所在的作用域中的数据(通过外围类引用)
- 内部列可以对同一个包中的其他类隐藏起来(设置为private)
内部类注意事项
- 内部类中所有静态域都必须是final,因为如果不为final,每一个外部类的对象都会有一个单独的实例
- 内部类不能有static方法(可以有,但是没必要)
两个引用
外围类作用域外引用内部类 : OuterClass.InnerCLass
内部类引用外围类 : OuterClass.this
OuterClass.InnerClass innerClass =outer.new InnerClass();
在有可见性的情况下,这段代码在Main函数中创建了一个内部类对象
OuterClass.this.print();
这段代码在内部类内部调用了外部类的方法(不存在可见性问题)
InnerClass innerClass = new InnerClass();
innerClass.InnerMethod();
这段代码在外部类的方法中,实例化了一个内部类对象,并调用内部类方法(不存在可见性问题)
内部类是一种编译器现象,与虚拟机无关。编译器会把内部列翻译成用$分隔外部类名和内部类名的常规类文件
局部内部类
概念:定义在方法内部,不能有访问说明符,对外部世界完全隐藏,包括这个方法所在的类的内部。特点
- 同样能访问包含它的外类的变量
- 访问所在方法中的局部变量(必须为final)
匿名内部类
在局部内部类中,如果只创建这个类的一个对象那个,就不必命名了语法:
OuterClass anonymous = new OuterClass(){};