Java的四种内部类

项目结构

接口

public interface Vehicle {
    public String desc(String detail);
}

public class Car {
    private static String type = "汽车";
    private String desc;
    public Car(String desc) {
        this.desc = desc;
    }
    /*
     *  常规内部类:定义在外部类类体中,直接使用外部类的实例变量和实例方法。
     */
    class Ferrari{
        private String name;
        public Ferrari(String name) {
            this.name = name;
        }
        public String desc(){
            return desc + " : " + name;
        }
    }
    /*
     * 静态内部类:只能访问外部类的static成员,不能直接访问外部类的实例变量、实例方法
     */
    public static class Jaguar{
        private static String name = "捷豹";
        public String desc(){
            return type + " : " +name;
        }
    }
    /*
     *  局部内部类:在方法中定义,只能访问方法的final型实参、final型局部变量。
     *  方法结束后,方法的实参、局部变量的生命周期结束,而局部内部类的对象仍然存在。
     */
    public String manufacture(final String manufacturer){
        final String desc = "中型车";
        class Ford{
            private String name;
            public Ford(String name){
                this.name = name;
            }
            public String getName() {
                return name;
            }
        }
        Ford ford = new Ford("金牛座");
        return manufacturer + " : " + desc + " : " + ford.getName();
    }
    /*
     * 匿名内部类:
     * 1 继承一个类或实现一个接口。不能同时实现一个接口和继承一个类,也不能实现多个接口。
     * 2 不能定义构造方法。
     * 3 匿名内部类的定义和第一次使用都发生在同样一个地方。
     */
    private Vehicle vehicle = new Vehicle() {
        
        @Override
        public String desc(String detail) {
            return desc + " : " + detail;
        }
    };
    public Vehicle getVehicle() {
        return vehicle;
    }
}

运行

public class Test {
    public static void main(String[] args) {
        Car car = new Car("独立悬挂");
        // 常规内部类
        Car.Ferrari ferrari = car.new Ferrari("Ferrari 488GTB");
        System.out.println(ferrari.desc());
        // 静态内部类
        Car.Jaguar jaguar = new Car.Jaguar();
        System.out.println(jaguar.desc());
        // 局部内部类
        System.out.println(car.manufacture("长安福特"));
        // 匿名内部类
        System.out.println(car.getVehicle().desc("本田第十代雅阁"));
    }
}
原文地址:https://www.cnblogs.com/sea-breeze/p/7002401.html