内部类:是指把一个类的声明放到另一个类的声明中,甚至是放到一个方法内部,这样的类称为 内部类。
内部类分为 命名内部类和匿名内部类:
package outterclass1; /** * 下面的代码也许毫无意义,这里只是讨论内部类而已。 * * @author WilsonPeng [email protected] * */ public class OutterClass { private String name = "Outter Class Name"; // 下面这个InnerClass命名内部类,访问修饰符可以是public、protected、没有、 private private class InnerClass { private String name = "Inner Class Name"; /** * 内部类中直接写this是指内部类,而如果先写 外部类名然后写this ,则能访问外部类的属性和方法。 */ public void getOutterClassName() { System.out.println(OutterClass.this.name); } /** * 调用外部类的方法 */ public void invokeOutterClassMethod() { f(); } /** * 这里返回的是内部类的 name */ public String getName() { return this.name; } } // 在外部类中声明一个内部类类型的属性 private InnerClass ic = new InnerClass(); public void f() { System.out.println("这是 OutterClass 的方法"); } public void accessInnerClass() { ic.invokeOutterClassMethod(); } public InnerClass getIc() { return ic; } /** * 创建一个外部类对象,并获得内部类对象,然后通过内部类对象拿到外部类的name. * * @param args */ public static void main(String[] args) { OutterClass oc = new OutterClass(); oc.getIc().getOutterClassName();//输出:Outter Class Name } }
package outterclass2; /** * 我自己很少使用内部类,暂时还没有发现内部类在实际项目中发挥的作用,尤其是下面的方法中的内部类。 * * @author WilsonPeng [email protected] * */ public class OutterClass2 { // 方法中的内部类的访问修饰符 :没有 、 abstract 、 final public void f() { String name = "temp variable name"; class InnerClass { private String name = "Inner Class temp variable name"; public void getOutterName() { System.out.println("怎么拿到上面那个name,我还真不知道,欢迎告知...."); } } InnerClass ic = new InnerClass(); ic.getOutterName(); } public static void main(String[] args) { OutterClass2 oc2 = new OutterClass2(); oc2.f(); // 输出:怎么拿到上面那个name,我还真不知道,欢迎告知.... } }
public class OutterClass{ /** * 这里的参数可以是抽象类,具体类和接口 */ public static void f(Exception e) { e.printStackTrace(); } //这里f的参数就是一个 匿名内部类,会立即创建一个该匿名内部类的对象 public static void testF() { f(new Exception() { @Override public void printStackTrace() { System.out.println("NND"); } }); } public static void main(String[] args) { testF(); //输出 NND } }
package outterclass2; import outterclass1.OutterClass; import outterclass1.OutterClass.InnerClass; public class OutterClass3 { public void f(){ OutterClass oc = new OutterClass(); InnerClass ic = oc.new InnerClass(); } }