简言

如果看完基础部分部分同学依然会觉得,内部类不太常用,没什么用武之地。如果你没有这么想,我觉得你~~~有眼光😎

内部类其实是一个很棒的设计,在java源码中使用也挺广泛的。说到这,虽然有人没用过内部类,但是我想说,你基本上天天都在间接的用内部类

向上转型

废话不说,先上一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Animal.java
public interface Animal {
String getPetName();
}

// People.java
public interface People {
String getPeopleName();
}

// Host.java
public class Host {

public People getFriend() {
return new Friend();
}

public Animal getBird() {
return new Bird();
}

private class Bird implements Animal {

public String getPetName() {
return "bird";
}
}

protected class Friend implements People {

public String getPeopleName() {
return "people";
}
}
}

// Main.java
public class Main {
public static void main(String[] args) {
Host host = new Host();
// Host.Bird bird = host.new Bird(); 编译出错
Host.Friend friend = host.new Friend();

System.out.println(host.getBird().getPetName());
System.out.println(host.getFriend().getPeopleName());

List<String> test = new ArrayList<String>();
}
}

开发分析代码:

  • Animal和People都是接口,都包含一个接口方法
  • Host是一个外部类,里面有内部类Bird实现了Animal接口、Friend实现了People接口
  • Bird是一个私有内部类,其他类无法访问,Friend同包和子类可以访问
  • Host有两个public方法getBird()和getFriend()分别返回Animal和People,但是真正返回的是Bird和Friend
  • 在Main方法里面访问Host的getBird和getFriend两个方法时,对于getBird而言,外界完全不知道具体的实现细节是什么

这里正是通过内部类向上转型为接口,并使用private来修饰,这三者的组合可以给类设计者提供一个很好的途径来完全隐藏不想被修改的内容

内部类向上转型的典型案例

上面介绍的时候说过,对于一个java程序员,即使没有直接写内部类,但是基本上每天也会间接的用到内部类,看过源码的同学可能会秒懂。

在上面的例子中最后一行代码,新建了一个空列表,那不是忘记删了,是为了看源码。
ArrayList是java程序员基本上每天都会使用的数据结构,如果一天没用到这个,,,我想说你在认真工作吗???

在ArrayList里面的迭代器就是使用了私有内部类的实现方式,通过这种方式,完全屏蔽了迭代器的具体实现,也无法更改,下图即为迭代器的部分代码