分享

Java内部类详解

 太极混元天尊 2018-05-20


推荐阅读:


内部类


内部类(nested classes),面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。


静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。


内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。


注意:以上是从百度上copy的,因为现在很多人都认为内部类包含了静态嵌套类。其实是有争议的,官方认为静态嵌套类并不是内部类,真正的内部类只有成员内部类,局部内部类,匿名内部类,并且官方认为内部类是没有显示或者隐士声明的静态的嵌套类。只是都给叫习惯了,所以我也就随着习惯来了。但是大家要知道有这么个事情。


使用内部类的好处


1. 内部类提供了更好的封装,只有外部类能访问内部类


2. 内部类可以独立继承一个接口,不受外部类是否继承接口影响


3. 内部类中的属性和方法即使是外部类也不能直接访问,相反内部类可以直接访问外部类的属性和方法,即使private利于回调函数的编写,


Java的四种内部类


成员内部类

局部内部类

匿名内部类

静态内部类


成员内部类


成员内部类也是最普通的内部类,它是外部类的一个成员,所以他是可以无限制的访问外围类的所有成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。


在成员内部类中要注意两点:


成员内部类中不能存在任何static的变量和方法 ,但是变量可以被static final修饰,主要是因为final类型在编译期间jvm有优化,常量池会维护这些变量。


虽然非静态内部类不能脱离外部类这个上下文实例化,但是常量池使得final变量脱离了类实例化这个条件,编译期间便可确定。


成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类

代码演示



总结:

1、内部类可直接使用外部类的私有成员变量或方法,外部类对内部类是可见的。


2、外部类中可以创建私有内部类对象。


3、外部类可通过内部类的对象调用内部类的私有成员变量或方法。


4、当内部类与外部类有同名成员变量和方法时,内部类可通过Outer.this方式来引用外部类成员。


5、必须先创建外部类才能创建内部类。


6、成员内部类不能含有static的变量和方法。因为成员内部类需要先创建外部类,才能创建它自己的。


局部内部类


方法内部类定义在外部类的方法中,局部内部类和成员内部类基本一致,只是它们的作用域不同,方法内部类只能在该方法中被使用,出了该方法就会失效。 


对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。


由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。


代码演示:


匿名内部类


匿名内部类其实就是一个没有名字的方法内部类,所以它符合方法内部类的所有约束,除此之外,还有一些地方需要注意:


在使用匿名内部类的过程中,我们需要注意如下几点:

1. 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。


2. 匿名内部类中是不能定义构造函数的。


3. 匿名内部类中不能存在任何的静态成员变量和静态方法。


4. 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。


5. 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。


格式

new 父类构造器(参数列表)|实现接口() 

    { 

     //匿名内部类的类体部分 

    }

举一个简单的例子:既然匿名内部类需要继承一个父类或者实现一个接口,所以我们先定义一个接口或者抽象类都可以。



静态嵌套类


关键字static可以修饰成员变量、方法、代码块,其实它还可以修饰内部类,使用static修饰的内部类我们称之为静态嵌套类。静态嵌套类与非静态嵌套类之间存在一个最大的区别。


我们知道非静态嵌套类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态嵌套类却没有。没有这个引用就意味着。


1.         静态嵌套类的创建是不需要依赖于外围类,可以直接创建

2.         静态嵌套类不可以使用任何外围类的非static成员变量和方法,而内部类(即为非静态嵌套类)则都可以。


下面做了一个成员内部类和静态嵌套类比对的简单例子。

以上就是所有的java内部类的各种模式的简单例子


大家要注意一点,java中只能在内部类中创建静态成员的类,也就是静态嵌套类,也有很多人疑惑为什么 java 静态嵌套部类中可以有非静态成员,还有为什么可以 new 一个静态类。(特别是 c# 程序员),所以C#程序员转过来的一定要注意,我就是其中一位!!!


公众号资源免费分享!!!

2017年某培训班最新视频+几十个项目免费分享 公众号输入“我要视频”


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多