成员内部类
public class InnerClass {
public static void main(String[] args) {
System.out.println("+++++++++++++++++++++++");
Outer.Inner oi = new Outer().new Inner();
oi.methodInner();
}
}
public class Outer {
int num = 10;
public class Inner{
int num = 20;
public void methodInner(){
int num =30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
局部内部类
public class InnerClass {
public static void main(String[] args) {
Outer out = new Outer();
out.methodOuter();
}
}
public class Outer {
int num = 10;
public void methodOuter(){
class Inner{
int num = 10;
public void methodInner(){
System.out.println(num);
}
}
Inner in = new Inner();
in.methodInner();
}
}
权限修饰符
外部类:public / default
成员内部类:public protect default private
局部内部类:什么都不能用
局部内部类,如果希望访问所在方法的局部变量,这个局变量必是final的。如果这个变量不变,final可不写。
原因
1.new 的对象在堆内存中。
2.局部变量跟着方法走,在栈内部中。
3.方法运行结束后,立即出栈,局部变量会消失。
4.但是内部类的方法要使用,必须要new一个对象,new出来对象在内存中一直存在,直到垃圾回收,这时局部变量可能已经销毁了。如果要使用,就自己要拷贝一个,但如果变量总变,没有办法拷贝,如果是final,则可以直接拷贝。
public class Outer {
public void methodOuter{
final int num = 10;
class Inner{
public void methodInner(){
System.out.println(num);
}
}
}
}
匿名内部类
如果接口实现类(或者父类的子类)只使用一次,这时候可以省略类的定义,而使用匿名内部类。
格式:
接口类名称 对象 = new 接口名称(){
//覆盖重写所有抽象方法
}
public class main {
public static void main(String[] args) {
myInterface obj = new myInterface() {
@Override
public void method() {
System.out.println("Inner method");
}
};
obj.method();
new myInterface(){
@Override
public void method() {
System.out.println("匿名对象使用匿名内部类");
}
}.method();
}
}