(转自: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。
二、作用
为什么使用内部类?使用内部类能带来什么好处?
我们用个例子来说明:
- public class Work {
- public String getContent() {
- return null;
- }
- }
- public class Tool {
- public void use() {
- }
- }
- public class Person {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Work getWork() {
- return new Work();
- }
- public Tool getTool() {
- return new Tool();
- }
- }
- public class Programmer extends Person {
- private String language;
- private class Programming extends Work {
- @Override
- public String getContent() {
- return "搭建框架";
- }
- }
- protected class Computer extends Tool {
- private String soft;
- @Override
- public void use() {
- this.soft = "Eclipse";
- Programmer.this.language = this.soft + "工具中的Java语言";
- }
- }
- public void doWork() {
- getTool().use();
- System.out.println(getName() + "用" + language + getWork().getContent());
- }
- @Override
- public Work getWork() {
- return new Programming();
- }
- @Override
- public Tool getTool() {
- return new Computer();
- }
- public static void main(String[] args) {
- Programmer programmer = new Programmer();
- programmer.setName("王鹏");
- programmer.doWork();
- }
- }
运行结果:
- 王鹏用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这三个类,同样能实现多态,代码如下:
- public class Programmer extends Person {
- public class Programming extends Work {
- public Person getPerson() {
- return Programmer.this;
- }
- }
- public class Computer extends Tool {
- public Person getPerson() {
- return Programmer.this;
- }
- }
- }
- public class ProgrammerTest {
- private Programmer programmer;
- public ProgrammerTest() {
- programmer = new Programmer();
- programmer.setName("王鹏");
- }
- public Work testWork() {
- return programmer.new Programming();
- }
- public Tool testTool() {
- return programmer.new Computer();
- }
- public Person testPerson() {
- return programmer;
- }
- public static void main(String[] args) {
- ProgrammerTest test = new ProgrammerTest();
- Programmer programmer = (Programmer) test.testPerson();
- System.out.println(programmer.getName());
- Programmer.Computer computer = (Programmer.Computer) test.testTool();
- programmer = (Programmer) computer.getPerson();
- System.out.println(programmer.getName());
- Programmer.Programming programming = (Programmer.Programming) test.testWork();
- programmer = (Programmer) programming.getPerson();
- System.out.println(programmer.getName());
- // 方法入参的多态就不掩饰了,如testTool(Tool tool),可将Tool转化为Programmer
- }
- }
输出结果:
- 王鹏
- 王鹏
- 王鹏
由上个例子可以看出,Person、Tool、Programming都可以转化为同一个Programmer,从而实现了“多继承”的多态体现。内部类是Java多继承的技术实现的手段。
Java内部类详解(三)
Java内部类详解(一)的更多相关文章
-
Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
-
[转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
-
【转】Java内部类详解
一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...
-
Java内部类详解 2
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
-
【Java_基础】Java内部类详解
1.四种内部类 java中的四种内部类:成员内部类.静态内部类.局部内部类和匿名内部类.其中匿名内部类用到的最多. 1.1.成员内部类 若一个类定义在另一个类的内部作为实例成员,我们把这个作为实例成员 ...
-
Java内部类详解(转)
说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本 ...
-
Java 内部类详解
什么 定义在一个类内部的类,称为内部类(累不累),如下: public class A { private int c = 1; public class C { public void test() ...
-
(转)java内部类详解
本文转自http://www.cnblogs.com/dolphin0520/p/3811445.html,谢谢作者 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能 ...
-
Java——内部类详解
说起内部类,大家肯定感觉熟悉又陌生,因为一定在很多框架源码中有看到别人使用过,但又感觉自己使用的比较少,今天我就带你具体来看看内部类. 内部类基础 所谓内部类就是在类的内部继续定义其他内部结构类. 在 ...
随机推荐
-
Java面试基础概念总结
面向对象软件开发的优点有哪些? 答:开发模块化,更易维护和修改:代码之间可以复用:增强代码的可靠性.灵活性和可理解性. 多态的定义? 答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力. ...
-
JavaScript数组的方法
push() :将参数加载到数组的最后,返回数组的长度 pop() :删除数组的最后一个元素,返回删除的值 shift() :删除数组的第一个元素,返回删除的值 unshift ...
-
Linux常用服务部署与优化之NFS篇
NFS(network file system)的简称,是linux系统之间常用的一种文件共享方式,下面简述其搭建过程,需要两个linux系统的虚拟机,假设客户端的ip为192.168.1.105,服 ...
-
分享JS代码(转)
var imgUrl = 'http://xxx/share_ico.png'; // 分享后展示的一张图片 var lineLink = 'http://xxx'; // 点击分享后跳转的页面地址 ...
-
【leetcode】3Sum
3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find a ...
-
例题6-5 Boxes in a line uVa12657
这道题目的解决方案是双向链表,数据结构本身并不复杂,但对于四种情况的处理不够细致,主要体现在以下几点: 分类讨论不全面,没有考虑特殊情况(本身不需要操作,需要互换的两元素相邻) 没有考虑状态4改变后对 ...
-
【redis】02string类型和hash类型
Redis的数据类型 Redis主要分为五个数据类型,一个是string,最简单的一个数据类型,hash,list, 还有set集合,还有zset有序集合,这是咱们redis的五种基础类型, 接下 ...
-
在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程)
在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程) 原文链接:http://www.360doc.com/content/14/1117/10/16948208_42571794 ...
-
poj3461Oulipo
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...
-
OC-nonatomic和atomic相关
1.原子和非原子属性1.1>OC在定义属性时又nonatomic和atomic两种选择(1)atomic:原子属性,为setter方法加锁(默认就是atomic)(2)nonatomic:非原子 ...