Java内部类详解(一)

很多人对于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内部类详解(一))