内部类

分四种 普通内部类 静态内部类 局部内部类 匿名内部类

普通内部类

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