转java的第234天:聊聊内部类
flag
2020年7月8日,入职第一天就迎来了一个噩耗:用java。这一天已过去234天了,现在的我已经可以熟练的使用java(的if else语法)了,不过对更为细节的语法、jvm原理、多线程编程等各方面均需要深入学习。因而我在此告知诸位,本人立帖为证,每日头悬梁锥刺股,努力学习it技术,保持帖子周更。倘若没有做到,那就当我没说过。
Java内部类
所谓内部类,就是类中类。内部类的定义放在了另外一个类中。基本形式如下:
// 外部类
public class TestInnerClass {
// 内部类
class InnerClass {
}
}
创建内部类对象
- 在所属外部类中创建(如上边的 `TestInnerClass` ):
- 可以直接使用new语句: InnerClass inner = new InnerClass();
- 在所属外部类之外的类中创建:
- 带有private标志的内部类:不可创建
- 带有public和static标志的内部类:
-
TestInnerClass.InnerClass inner = new TestInnerClass.InnerClass();
-
- 带有public标志的内部类,可通过外部类的对象创建:
内部类的访问权限
- private:此内部类只能在所属外部类访问(创建对象,若构造函数可用)
- protected:此内部类只能在所属外部类及其子类中访问,所属外部类中可创建内部类对象。如果构造函数为public,则子类也可以创建内部类对象,否则不行。
- public:所有类都可以访问该内部类(创建对象,若构造函数可用)
- 包访问权限:同一包下的类可访问(创建对象,若构造函数可用)
内部类与所属外部类的关系
- 内部类一定属于某个外部类,这种关系在各自的对象上也有体现。
- 非静态内部类:内部类对象指向某个外部类对象,并且可以访问外部类对象的成员变量(函数)。这代表着必须通过某个外部类对象来创建内部类对象。
- 静态内部类:内部类指向了外部类,可以访问外部类的静态成员变量(函数)。内部类对象不再指向某个具体的外部类对象。
内部类的用途
- 在实现某个功能时,难免会用到一些private函数,这些函数不希望被外部访问。假如private函数较多,且具有一些共性,则可以考虑用内部接口加内部类的形式实现。比如在一个画图的类中,对外只开放了一个接口:随机一个图形。则可以创建一些private内部类,分别来画圆、正方形等,这些类不允许外部访问:
-
public class DrawLogic { private static final List<DrawLogicInner> drawLogics = Arrays.asList( new CircleDrawLogicInner(), new SquareDrawLogicInner() ); // 提供给外部的接口 public Graph randomDraw() { DrawLogicInner drawLogicInner = drawLogics.get(new Random().nextInt() % 2); return drawLogicInner.draw(); } // ----------画图逻辑----------- // // 具体的画图逻辑全部隐藏在内部 private interface DrawLogicInner { Graph draw(); } private static class CircleDrawLogicInner implements DrawLogicInner { @Override public Graph draw() { /* 画圆形 */ return new Graph(); } } private static class SquareDrawLogicInner implements DrawLogicInner { @Override public Graph draw() { /* 画正方形 */ return new Graph(); } } public static class Graph { } }
-