java ---内部类
1. 成员内部类
内部类视作一个成员:内部类没有静态成员(内部类作为一个成员,要先有一个外部类对象存在,而静态成员不依赖于对象)
内部类可以访问其外部类所有成员
内部类对象必须依赖于一个外部类对象,即先有外部类对象,然后才能由外部类对象来创建内部类对象。
public class Outer { private static String staticMember = "外部类静态变量"; private String member = "外部类成员变量默认值"; public static void staticMethod() { System.out.println("外部类静态方法"); } public void ordinaryMethod(){ System.out.println("外部类成员方法"); } public void fun(){ System.out.println("外部类"); } class Inner{ public void innerMethod(){ System.out.println(staticMember); System.out.println(member); staticMethod(); ordinaryMethod(); Outer.this.fun();//调用外部类同名方法 } public void fun(){ System.out.println("内部类"); } } public static void main(String[] args) { Outer a = new Outer(); Outer.Inner b = a.new Inner(); //创建内部类对象,必须通过一个外部类对象 // b.innerMethod(); a.fun(); b.fun(); } }
有同名变量、方法时,在内部类方法中调用:
调用内部类自己的:this.xxx
调用外部类的:Outer.this.xxx
2. 静态内部类
在内部类前加static,静态内部类中可有static成员
将这个静态内部类看作外部类的一个静态成员就可以了(可以访问外部类的静态方法和静态变量)
静态内部类对象不依赖于外部类对象,可以直接创建。
3. 局部内部类
即在外部类的方法区域内定义的类,域成员内部类区别在于作用域不同
4. 匿名内部类
public class Outer { interface Inner{ void fun(); } public Inner getInner(){ return new Inner(){ @Override public void fun() { System.out.println("匿名内部类的方法"); } }; } public static void main(String[] args) { Outer a = new Outer(); Inner b = a.getInner(); b.fun(); } }