内部类
-
在一个类的内部定义其他的类,这样的内部其他的类,就是内部类。使用
class
来创建内部类。 -
内部类的优点是:可以轻松访问外部类中的私有属性和方法。外部类也可以访问内部类中的私有属性。
-
想起之前看到的静态内部类单例模式:
public class Outer { private Outer() { } private static class Inner{ // 调用外部类的私有构造器 private static Outer outer = new Outer(); } public static Outer getInstance() { // 访问内部类的私有outer return Inner.outer; } }
具体好处涉及多线程,暂时不谈。但是这种方法也可以只生成唯一的单例。
-
如果内部类不是私有的,在外部可以通过
外部类.内部类 内部类对象 = new 外部类().new 内部类
来构建内部类对象public class Outer { Inner inner; public void setInner(Inner inner) { this.inner = inner; } public String getInnerName() { // 可以调用内部类对象的私有属性 return this.inner.name; } class Inner{ private String name; public Inner() { } public Inner(String name) { this.name = name; } public String getPublicContent() { return "innerPublic"; } } } // Main.java public class Main { public static void main(String[] args){ Outer outer = new Outer(); outer.inner = outer.new Inner(); // outer.inner.name; 在外部即使是使用外部类也不可以调用内部类的私有属性 System.out.println(outer.inner.getPublicContent()); } }
-
抽象类或接口也可以定义内部结构。
-
内部抽象类可以定义在普通类,接口,抽象类中。
-
接口内部的抽象类也可以实现该接口。
-
若内部类使用了
static
来标识,则可以直接进行new 外部类.内部类()
来实例化内部类对象。public class Outer { static class Inner{ public Inner() { } } } // Main.java public class Main { public static void main(String[] args){ Outer.Inner inner = new Outer.Inner(); } }
-
也可以定义static内部接口,此功能更常用。
-
内部类可以在任意的结构中进行定义,这就包括了:类中,方法中,代码块中。
-
使用类对象后加
{...}
内部可以定义方法叫做匿名内部类。public class Main { public static void main(String[] args){ List<String> list = new List<String>() { @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public boolean contains(Object o) { return false; } @Override public Iterator<String> iterator() { return null; } // 此处省略一大堆需要覆写的方法 }; } }
12.
文章涉及图片来源于魔乐科技