内部类 把一个类的定义放在另一个类定义内部的类。
1.外部类创建内部类
package main.java.innerclass; public class Outer { /** * 简单内部类,包可见 * * */ class Inner { private String name = "inner1"; public String toString() { return name; } } /** * 简单内部类,仅外部类自己可见,其他类不可获取此类实例的引用 * */ private class PrivateInner { private String name = "inner1"; public String toString() { return name; } } /** * 在外部类的非静态方法中使用内部类,和使用普通类无区别 */ public void useInnerClass() { Inner inner1 = new Inner(); System.out.println(inner1); } /** * 外部类返回一个内部类的引用 常用用法 * * @return */ public Inner getInnerInstance() { return new Inner(); } /** * 在外部类的静态方法中得到一个内部类的引用 * * @param args */ public static void main(String[] args) { Outer outer = new Outer(); /** * 只能在存在外部类实例时创建内部类实例 */ Inner inner1=outer.new Inner(); /** * 报错,不存在外部类实例,不能直接获取内部类实例的引用 */ //Inner inner2=new Inner(); } }
2.其他类创建内部类
与外部类创建内部类的区别在于:
需要使用外部类名.内部类名的方式获取引用。
不能获取作用域外的内部类的引用,如private类型内部类,以及不在同一个包内的 默认类型的内部类引用。
package main.java.innerclass; public class Normal { public static void main(String[] args) { Outer outer=new Outer(); /** * 报错,找不到Inner这个类型 */ //Inner inner=new Inner(); /** * 需要外部类名.内部类名的方式获取引用 */ Outer.Inner inner1=outer.getInnerInstance(); /** * 通过外部类实例使用new关键字创建内部类实例。 */ Outer.Inner inner2=outer.new Inner(); } }