提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦。学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构。
Java中的内部类共分为四种:
静态内部类 static inner class (also called nested class)
成员内部类 member inner class
局部内部类 local inner class
匿名内部类 anonymous inner class
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
内部类的作用:
1、隐藏你不想让别人知道的操作,也即封装性。
2、一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!
内部类的功能在于,每个内部类都能独立的继承一个接口的实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整,并且内部类允许继承多个非接口类型(类或抽象类)。通过内部类分别继承一个基类,外部类创建内部类的对象,并使用内部类的方法,变相地实现了多继承。
下面从以下几个方面来介绍:
public interface Contents {
int value();
}
public interface Destination {
String readLabel();
}
public class Goods {
private class Content implements Contents {
private int i = 11;
public int value() {
return i;
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}
}
class TestGoods {
public static void main(String[] args) {
Goods p = new Goods();
Contents c = p.cont();
Destination d = p.dest("Beijing");
}
}
public class OutClassTest {
private int num ;
public OutClassTest(){
}
public OutClassTest(int num){
this.num = num;
}
private class Inner{
public OutClassTest getTest2(){
return OutClassTest.this;
}
public OutClassTest newTest2(){
return new OutClassTest();
}
}
public static void main(String [] args){
OutClassTest outClass = new OutClassTest(5);
OutClassTest.Inner innerClass = outClass.new Inner();
OutClassTest test2 = innerClass.getTest2();
OutClassTest test3 = innerClass.newTest2();
System.out.println(test2.num);
System.out.println(test3.num);
}
}------输出-------------------
5
0
注意:只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();