java静态内部类与普通内部类

    java中内部类是个很有讲究的研究点,今天就把自己对内部类的认识简单地说下,希望对正在学习的新手有些帮助,我会尽可能的说的详细点,如果有疑问,可以联系,共同进步。

   java中可能我们经常听到普通内部类,静态内部类,匿名内部类这几个名词,我们在jfram编程中可能会经常使用匿名内部类,去使用它对某一控件实现监听,好处就是简单粗暴,但是当然这种方式导致在一类具有相同功能的控件不能复用代码,还有这样会使整体代码显得冗长复杂,于是我们可以定义一个普通内部类去实现,这样就使整体结构清晰多了。这也是本文为什么只讨论静态内部类和普通内部类的原因。

   还是一样,我们从大多数学习者最关心的语法上两者的区别开始讲: 
   你可以从static和非static特性来理解,这一切都是水到渠成。   <strong>1</strong>,当你用static修饰类时,意味着你不需要外部类的引用,因为它是外部类所有对象共有的也即是只需和外部类名称关联,所以你在实例化静态内部类时(不要类比太多,不要以为我们不需要静态内部类的引用,因为我们还没有见过静态类,事实上也不存在)可以这样 InnerClass inner=new OuterClass.Inner();而普通内部类的实例的创建则需要外部类的实例的引用(你可以类比类的非静态变量,它是依附于类的实例的)如:InnerClass inner=new OuterClass().new Innerclass();(看起来很诡异)   <strong>2</strong>,继续类比static和非static,那么他们在“权限”和被“权限”方面又是怎么样的呢?这里的“权限”就是他们访问外部类的权限。static内部类可以访问外部类的静态成员变量和静态方法,但是不能访问非静态的成员变量和方法(类比静态方法访问类的成员方式,这是显然的),但是非static内部类却可以不受限制的访问外部类的成员及方法(包括private类型的,这也是内部类为什么用的地方很多,但是static内部类用的不多的原因)被“权限”当然是指外部类访问它们的意思了,外部类可以任意访问他们而没有限制,只是访问的方式有区别,这也引出了第三点差别,内部类的成员差别    <strong>3</strong>,static内部类可以有static和非static成员变量,可是非static内部类却不能够拥有static类型成员,这就导致我们上一点所说的外部类对内部类成员引用上的差别。那么实际中我们在内部类怎么访问外部类成员呢?通过上面的解释,因为非static内部类是依赖于外部实例的所以,我们在非static内部类中必须有一个外部类实例的引用,你可以在创建这个引用时就给它new一个对象就像:OuterClass outer=new OuterClass();你也可以利用非static内部类的构造函数传进来一个外部类的引用来赋给它,通常我们会用后者(这会具有一定的实用性,如果我们在外部类的外部通过内部类对这个内部类所依赖的外部类实例进行某些不可描述的操作–我也晕了),然后就可以对外部类的所有成员进行操作了;相比较而言,static内部类操作外部类的成员就简单多了(这种情况很少,因为虽然我们在语法上可以操作外部类的static成员,但是我们设计static内部类时往往是基于外部内需要引用内部类但是内部类不需要用到外部类成员)直接在static内部类用外部类名字调用它的静态成员即可。</p>

    接下来就讨论其实我们在上面已经部分讨论的问题,就是它们在设计理念上有什么区别:static内部类为了直接引用外部类某些静态静态变量或静态方法来达到解决某些问题的目的(很少),而且在设计时其实你抱的心态是我外部类可能会用到这个内部类的东西解决我手头的事情但是我的这个内部类很少或基本不会用到外部类的成员;而非static内部类,则是内部类需要其依附的外部类的数据,当然我外部类也会需要这个内部类为我手头里的事情提供某些解决办法,所以非static内部类用的多

    <strong>其实大家通过上面我的介绍应该也有些感觉内部类其实和外部类的关系并不是si-a关系</strong>,虽然我们一直在类比成员变量和成员方法,但事实上,他并不是一个成员,只是设计出来为了使解决现实中某些事物关系更加方便或者更加清晰简化出来的方法,他们在编译后是处在不同的.class文件中的。 <br>

欢迎大家交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值