1. 首页
  2. Java基础

034-三十四、Java内部类详解

内部类

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

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

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

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

使用内部类的好处

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

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

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

Java的四种内部类

成员内部类

局部内部类

匿名内部类

静态内部类

成员内部类

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

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

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

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

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

代码演示
34-三十四、Java内部类详解"
34-三十四、Java内部类详解"

总结:

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

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

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

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

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

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

局部内部类

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

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

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

代码演示:
34-三十四、Java内部类详解"

匿名内部类

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

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

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

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

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

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

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

格式


new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 }

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

静态嵌套类

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

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

  1.    静态嵌套类的创建是不需要依赖于外围类,可以直接创建
    
  2.    静态嵌套类不可以使用任何外围类的非 `static` 成员变量和方法,而内部类(即为非静态嵌套类)则都可以。
    

下面做了一个成员内部类和静态嵌套类比对的简单例子。
34-三十四、Java内部类详解"

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

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

写完了如果写得有什么问题,希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:034-三十四、Java内部类详解

    链接:https://www.javajike.com/article/1341.html

« 035-三十五、Java基本数据类型的包装类
033-三十三、数组的常用操作»

相关推荐

QR code