内部类
分四种 普通内部类 静态内部类 局部内部类 匿名内部类
普通内部类
public class NormalOuter { private int cnt = 1; public class NormalInner { public int cnt = 2; public void show(int cnt) { System.out.println("外部类的cnt是 " + NormalOuter.this.cnt); System.out.println("内部类的cnt是 " + this.cnt); System.out.println("形参cnt是 " + cnt); } } } public class Test { public static void main(String[] args) { NormalOuter.NormalInner inner = new NormalOuter().new NormalInner(); inner.show(3); } } /** * 外部类的cnt是 1 * 内部类的cnt是 2 * 形参cnt是 3 */
静态内部类
public class StaticOuter { private int cnt; //访问不到 private static int snt = 1; public static class StaticInner { private static int snt = 2; public void show() { System.out.println("外部的snt是 " + StaticOuter.snt); System.out.println("内部的snt是 " + snt); } } } public class Test { public static void main(String[] args) { StaticOuter.StaticInner inner = new StaticOuter.StaticInner(); inner.show(); } }
内部类也有自己的java文件。比如NormalOuter$NormalInner.java 和 ...
局部内部类
语法没什么特殊的,就是在方法里定义一个类。
注意最后一点,内部类里面如果用了外部方法的局部变量,为了避免生命周期不同,会隐式地进行拷贝。所以使用的其实是外部方法的局部变量的拷贝。这样的话如果允许修改外部方法的局部变量的值,会造成值的不一致问题。
匿名内部类
匿名内部类涉及到了回调。所谓回调简单来说就是自己定义了一个函数供“别人”使用。
比如
Arrays.sort(arr, new Comparator<int>() {.......});
在这个例子里,我们自己创造了一个无名的Comparator接口的实现类,并覆盖了compare方法,供sort函数使用。
枚举类
设计思想基本等同于单例模式。(也难怪可以用枚举实现单例)
//单例版本 public class Direction { private final String desc; public static final Direction UP = new Direction("上"); public static final Direction DOWN = new Direction("下"); public static final Direction LEFT = new Direction("左"); public static final Direction RIGHT = new Direction("右"); private Direction(String desc) { this.desc = desc; } public String getDesc() { return desc; } } public class Test { public static void main(String[] args) { System.out.println(Direction.UP.getDesc()); } }
//枚举版本 public enum DirectionEnum { UP("上"),DOWN("下"),LEFT("左"),RIGHT("右"); private final String desc; private DirectionEnum(String desc) { this.desc = desc; } public String getDesc() { return desc; } } public class Test { public static void main(String[] args) { System.out.println(DirectionEnum.DOWN.getDesc()); } }
常用API
实现接口
自定义的枚举类因为已经继承了Enum类,所以不能再继承别的类了。但可以正常实现接口。实现接口可以整体实现,也可以每个对象各自实现接口。各自实现只需要再对象后面接大括号就行了。