关于Condition中访问AQS方法的问题

在昨天的文章中,我提到 “它可以访问AbstractQueuedSynchronizer中的方法和其余内部类( AbstractQueuedSynchronizer是个抽象类,至于他怎么能访问,这里有个很奇妙的点,后面我专门用demo说明 )”

     现在专门来说下这个问题。
     AQS中有个public 内部类,(没错就是public 内部类)实现了Condition接口,叫做ConditionObject :
CC1
   一般,内部类是不允许被定义为public的,这里可以的原因是它的外部类AQS(AbstractQueuedSynchronizer)是抽象类,所以它可以有一个public的内部类。 我用一段demo模拟了这种结构:
CC2
可以看到Condition的signal方法可以调用外部抽象类的enq方法,这里编译通过了,是不是觉得很奇妙,为什么一个public的内部类类还可以调用外部抽象类的方法呢?
  抽象类是不能被实例化的,那它的成员方法怎么会被调用?
  于是我写了个demo:
 CC3 
   可以看到这里是不能直接new Condition的,Condition明明是public的为什么不能直接new 呢? 这也是我疑问的地方。
   仔细琢磨一番后,想起来了, 内部类的实例化只有加上static 修饰符后 才可以不和外部类有任何关系,随意进行实例化,你可以把static 修饰的内部类直接当成一个完全独立的类是去使用。
   反之,不管你是不是被public 修饰,只要是内部类,就必须依托于外部类的一个实例去实例化,这里外部类是抽象的,不能直接实例化,那还不简单,这么做:
  CC4
  通过编译了,再运行一下:
CC5
  用法还是很巧妙的,没错,Condition和AQS就是这么设计和实现的。
0.00 avg. rating (0% score) - 0 votes

发表评论

电子邮件地址不会被公开。 必填项已用*标注