(转自:http://blog.csdn.net/wangpeng047/article/details/12344593)

很多人对于Java内部类(Inner Class)都十分陌生,甚至听都没听过也没有使用过,内部类在Java中其实是比较重要的一块内容,掌握好这门知识对于编程来说,犹如插上一对翅膀。

一、概念

内部类是指在一个外部类的内部再定义一个类,类名不需要和文件名相同。

对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后会生成outer.class和outer$inner.class两个类。所以内部类的成员变量、方法名可以和外部类的相同。

内部类可以是静态static和非静态的,访问级别可用public,default,protected和private修饰。而外部顶级类即类名和文件名相同的只能使用public和default。

二、作用

为什么使用内部类?使用内部类能带来什么好处?

我们用个例子来说明:

  1. public class Work {
  2. public String getContent() {
  3. return null;
  4. }
  5. }
  6. public class Tool {
  7. public void use() {
  8. }
  9. }
  10. public class Person {
  11. private String name;
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public Work getWork() {
  19. return new Work();
  20. }
  21. public Tool getTool() {
  22. return new Tool();
  23. }
  24. }
  25. public class Programmer extends Person {
  26. private String language;
  27. private class Programming extends Work {
  28. @Override
  29. public String getContent() {
  30. return "搭建框架";
  31. }
  32. }
  33. protected class Computer extends Tool {
  34. private String soft;
  35. @Override
  36. public void use() {
  37. this.soft = "Eclipse";
  38. Programmer.this.language = this.soft + "工具中的Java语言";
  39. }
  40. }
  41. public void doWork() {
  42. getTool().use();
  43. System.out.println(getName() + "用" + language + getWork().getContent());
  44. }
  45. @Override
  46. public Work getWork() {
  47. return new Programming();
  48. }
  49. @Override
  50. public Tool getTool() {
  51. return new Computer();
  52. }
  53. public static void main(String[] args) {
  54. Programmer programmer = new Programmer();
  55. programmer.setName("王鹏");
  56. programmer.doWork();
  57. }
  58. }

运行结果:

  1. 王鹏用Eclipse工具中的Java语言搭建框架

这个简单例子是描述一个程序员的工作,在现有Person、Tool、Work三个类的基础上,衍生出了程序员Programmer类。Programmer类中定义了内部类Programming和Computer,并且访问级别分别是private和protected。

1. 封装

通过上面例子的main方法中,我们看到,调用者并不知道Programming和Computer这两个内部类的存在,对外只暴漏了Programmer类。由于Programming和Computer只是为Programmer服务的,完全没必要单独建立个类文件,因而通过内部类我们可以隐藏掉不想让别人知道的操作。内部类是封装性的进一步体现

2. 多继承

我们知道,Java是单继承语言,只能继承一个类,然而通过内部类,我们可以变相实现“多继承”。例如上面的例子中,Programming继承Work,Computer继承Tool,Programmer继承Person,而Programming和Computer是Programmer的内部类,因此就相当于Programmer继承了Person、Work、Tool这三个类,同样能实现多态,代码如下:

  1. public class Programmer extends Person {
  2. public class Programming extends Work {
  3. public Person getPerson() {
  4. return Programmer.this;
  5. }
  6. }
  7. public class Computer extends Tool {
  8. public Person getPerson() {
  9. return Programmer.this;
  10. }
  11. }
  12. }
  13. public class ProgrammerTest {
  14. private Programmer programmer;
  15. public ProgrammerTest() {
  16. programmer = new Programmer();
  17. programmer.setName("王鹏");
  18. }
  19. public Work testWork() {
  20. return programmer.new Programming();
  21. }
  22. public Tool testTool() {
  23. return programmer.new Computer();
  24. }
  25. public Person testPerson() {
  26. return programmer;
  27. }
  28. public static void main(String[] args) {
  29. ProgrammerTest test = new ProgrammerTest();
  30. Programmer programmer = (Programmer) test.testPerson();
  31. System.out.println(programmer.getName());
  32. Programmer.Computer computer = (Programmer.Computer) test.testTool();
  33. programmer = (Programmer) computer.getPerson();
  34. System.out.println(programmer.getName());
  35. Programmer.Programming programming = (Programmer.Programming) test.testWork();
  36. programmer = (Programmer) programming.getPerson();
  37. System.out.println(programmer.getName());
  38. // 方法入参的多态就不掩饰了,如testTool(Tool tool),可将Tool转化为Programmer
  39. }
  40. }

输出结果:

  1. 王鹏
  2. 王鹏
  3. 王鹏

由上个例子可以看出,Person、Tool、Programming都可以转化为同一个Programmer,从而实现了“多继承”的多态体现。内部类是Java多继承的技术实现的手段

Java内部类详解(二)

 

Java内部类详解(三)

Java内部类详解(一)的更多相关文章

  1. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  2. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  3. 【转】Java内部类详解

    一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...

  4. Java内部类详解 2

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  5. 【Java_基础】Java内部类详解

    1.四种内部类 java中的四种内部类:成员内部类.静态内部类.局部内部类和匿名内部类.其中匿名内部类用到的最多. 1.1.成员内部类 若一个类定义在另一个类的内部作为实例成员,我们把这个作为实例成员 ...

  6. Java内部类详解(转)

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本 ...

  7. Java 内部类详解

    什么 定义在一个类内部的类,称为内部类(累不累),如下: public class A { private int c = 1; public class C { public void test() ...

  8. (转)java内部类详解

    本文转自http://www.cnblogs.com/dolphin0520/p/3811445.html,谢谢作者 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能 ...

  9. Java——内部类详解

    说起内部类,大家肯定感觉熟悉又陌生,因为一定在很多框架源码中有看到别人使用过,但又感觉自己使用的比较少,今天我就带你具体来看看内部类. 内部类基础 所谓内部类就是在类的内部继续定义其他内部结构类. 在 ...

随机推荐

  1. Tetrahedron based light probe interpolation(基于四面体的Light Probe插值)

    在当前的游戏引擎中,使用Light Probe来计算全局环境光对于动态物体的影响是一种很主流的方法.在预处理阶段生成完场景的Light Probe之后,传统的方法采用查找最近的8个相邻的Probe然后 ...

  2. F - Fibonacci again and again

    任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1, ...

  3. Python3中StringIO

    关于调用StringIO模块,python3中需要这样: from io import StringIO 而python2还是 from StringIO import StringIO

  4. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

  5. Int32 最大的数值是多少???(附十进制十六进制相互转换且包含正负数的java代码)

    正数转二进制很简单,转十六进制也很简单. 那么负数的情况下呢?在计算机中无法识别你给的符号“+”,"-",计算机只认识0和1 那么在二进制中如何表示负数. 先简单介绍一下负数如何转 ...

  6. POJ 3278 Catch That Cow[BFS+队列+剪枝]

    第一篇博客,格式惨不忍睹.首先感谢一下鼓励我写博客的大佬@Titordong其次就是感谢一群大佬激励我不断前行@Chunibyo@Tiancfq因为室友tanty强烈要求出现,附上他的名字. Catc ...

  7. virtuanenv+flask

    1.virtualenv&flask 专门为特定项目创建一个目录和一个虚拟的Python 运行环境 # 1.安装 virtualenv$ pip3 install virtualenv #.创 ...

  8. Exception 06 : org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session :

    异常名称: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was ...

  9. [development][security][modsecurity][nginx] nginx / modsecurity development things

    接续前节:[security][modsecurity][nginx] nginx 与 modsecurity nginx开发手册:https://nginx.org/en/docs/dev/deve ...

  10. [skill] 补码

    转载,写的很好!额,我的数学. 原文:https://www.douban.com/note/223507364/ 关于补码,看过一些书籍和网文,基本都是在“求反加一”的方法.步骤上反复强调,而对于补 ...