转java的第234天:聊聊内部类

转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 {
          }
      }

       

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值