嵌套类是指被定义在另一个类内部的类,它为外部类提供服务。嵌套类分四种:静态成员类、非静态成员类、匿名类和局部类。
一、静态成员类与非静态成员类的区别?在什么情况下可以用静态成员类?
我们知道在类的设计中,为了避免继承破坏封装性,组合优于继承。通过使用成员类来实现组合设计,需要足够了解它们的特性以及在何时使用。
从表面上看,静态成员类只是比非静态的成员类在声明上多出了修饰符static。尽管它们功能相似,但与实际上,非静态成员类的每个实例都隐含关联着一个外部类的实例。也就是说,非静态成员类不可能独立于它的外部类实例之外而独立存在。
公有静态成员类可作为辅助类,如Compass类中的枚举Dir:
View Code
1 package com.mnid.innerclass;
2
3 public class Compass {
4 private Dir direction = Dir.SOUTH;
5
6 public static enum Dir {
7 EAST, SOUTH, WEST, NORTH;
8 }
9
10 public Dir directing() {
11 //Bulk of class omitted12 return direction;
13 }
14 }
使用私有的静态成员类常见方法是用来代表外围类所代表的对象的组件,如一个Map实例,它的内部都有一个Entry对象对应Map中的所有键-值对,但Entry本身不需要访问Map,因此可以使用私有静态成员类设计。
非静态成员类实例都额外的对外部类实例的引用会引起不必要的开销。如果成员类不需要访问外部类实例,就应该将其声明为static的。
二、匿名类的限制和使用以及局部类
匿名类在声明的同时就进行实例化。它不是外部类的成员,并且只有在非静态环境中才有外围实例引用。
匿名类的常见用法是动态创建函数对象:
View Code
1 public String fetchShortest(String[] strArray) {
2
3 Arrays.sort(strArray, new Comparator() {
4
5 @Override
6 public int compare(String s1, String s2) {
7 return s1.length() - s2.length();
8 }
9 });
10 return strArray[0];
11 }
其他常见用法包括创建过程对象,如Runable、Thread;在静态工厂方法内部也经常用到。
局部类可以在任何声明局部变量的地方声明,其特性与其他三种嵌套类一样。
声明匿名类和局部类时需非常简短,以免影响可读性。