内部类
分四种 普通内部类 静态内部类 局部内部类 匿名内部类
普通内部类
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类,所以不能再继承别的类了。但可以正常实现接口。实现接口可以整体实现,也可以每个对象各自实现接口。各自实现只需要再对象后面接大括号就行了。

京公网安备 11010502036488号