Java内部类详解(一)(转自: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。

二、作用

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

我们用个例子来说明:

[java] view plaincopy

  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. }

运行结果:

[plain] view plaincopy

  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这三个类,同样能实现多态,代码如下:

[java] view plaincopy

  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. }

输出结果:

[plain] view plaincopy

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

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

Java内部类详解(二)

 

Java内部类详解(三)

时间: 2024-11-08 23:22:29

Java内部类详解(一)(转自:http://blog.csdn.net/wangpeng047/article/details/12344593)的相关文章

转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要讲解了异常.多线程.容器和I/O的相关面试题.首先,异常机制提供了一种在不打乱原有业务逻辑的前提下,把程序在运行时可能出现的状况处理掉的优雅的解决方案,同时也是面向对象的解决方案.而Java的线程模型是建立在共享的.默认的可见的可变状态以及抢占式线程调度两个概念之上的.Java内置了对多线程编程的支

Java语言的反射机制 笔记 摘自 http://blog.csdn.net/kaoa000/article/details/8453371

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. 1.Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类.在运行时构造任意一个类的对象.在运行时判断任意一个类所具有的成员变量和方法.在运行时调用任意一个对象的方法 2.Reflection 是Java被视为动态(或准动态)语言的一个关键性质.

java按照map的value排序 转载http://blog.csdn.net/tsingheng/article/details/7909861

java的TreeMap可以排序,只可惜是按照key来排序的,或者重写其他Map的排序算法也都是按照key来排序的,下面贴出来一个按照value排序的算法: [java] view plaincopy public class SortMap { public static void main(String[] args) throws Exception { // TODO code application logic here Map<String, Integer> myMap = ne

[转] Java内部类详解

作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.

Java内部类详解 2

Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811

Java内部类详解(转)

说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811445.html 一

Java 内部类详解

内部类顾名思义:就是类中还有类,Java内部类的出现解决了类中被private修饰的变量或引用可以被直接访问到. 成员内部类: 先看一下内部类的写法. public class Outer { private int x=9; class Inner{//内部类 void fun(){ System.out.println("Inner:"+x); } } } 因为该内部类和成员变量是同级别的,所以叫成员内部类,既然是成员内部类,那成员变量的修饰符完全适用于内部类中.下面看一下内部类实

Android APK反编译详解(附图) (转至 http://blog.csdn.net/ithomer/article/details/6727581)

本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x64 反编译工具包 下载 (2012-10-10更新) 一.Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具. apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui,是一个反编译工具,可以直接查看反编译后的

转-java编译时error: illegal character &#39;\ufeff&#39; 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061

原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常: java:[1,0] illegal character: \65279 表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了