四种内部类

四种内部类

实例内部类:直接定义在类当中的一个类,在类前面没有任何修饰符
静态内部类:在内部类前面加static
局部内部类:定义在方法内的类
匿名内部类:属于局部内部类的一种特殊情况

实例内部类:

属于对象的内部类,不属于类的,你使用static修饰的内部类
想要使用内部类,必须得先创建外部类
创建内部类对象当中,会有一个外部类的引用
在内部类当中可以访问外部类当中的成员
在内部类当中,不能有静态成员
外部类不能直接访问内部类当中的成员

package com.xiongda.inner;

class Outer {
    String name = "xiongda";

    class Inner {
        void print() {
            System.out.println(name);
        }
    }
}

/**
 * 
 * @author xiongda
 * @date 2018年8月5日
 * @description 创建实例内部类
 */
public class InnerClassDemo1 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.print();
    }
}

静态内部类:

在内部类前面加上static
静态内部类是不需要创建外部对象
在静态内部类当中,是没有外部类引用的
静态内部类,是可以访问外部类的静态成员

package com.xiongda.inner;

class Outer2 {
    static class Inner {
        static String name = "xiongda";
        String signature = "handsome boy";
    }
}

/**
 * 
 * @author xiongda
 * @date 2018年8月5日
 * @description 创建静态内部类 访问静态内部类当中的静态成员 访问静态内部类当中的非静态成员
 */
public class InnerClassDemo2 {
    public static void main(String[] args) {
        // 创建静态内部类
        Outer2.Inner inner = new Outer2.Inner();
        // 访问静态内部类的静态成员
        System.out.println(Outer2.Inner.name);
        // 访问静态内部类当中的非静态成员
        System.out.println(inner.signature);
    }
}

局部内部类:

定义在方法中的内部类
1.不能使用修饰符如 public private
2.局部内部类只能在定义的方法中使用
3.局部内部类当中不能包含静态变量
4.局部内部类当中可以包含局部变量,使用的局部变量的本质是final 常量

package com.xiongda.inner;

class Outer3 {
    void test() {
        // 这前面的修饰符默认是final类型,是存放在方法区当中
        String name = "xiongda";
        class Inner {
            void print() {
                System.out.println(name);
            }
        }

        Inner inner = new Inner();
        inner.print();
    }
}

/**
 * 
 * @author xiongda
 * @date 2018年8月5日
 * @description 创建局部内部类
 */
public class InnerClassDemo3 {
    public static void main(String[] args) {
        Outer3 outer = new Outer3();
        outer.test();
    }
}

匿名内部类 :

就是一个没有名字的局部内部类
匿名内部类没有构造器 一个文件对应一个类
当只使用一次的时候,才使用匿名内部类
创建匿名内部类需要借助父类的构造器或者接口
所以匿名内部类必须得有父类或者实现了接口
内部写的代码在new的时候就会自动执行

package com.xiongda.inner;

interface OuterDevice {
    void work();

}

class Device {
    void connectTo(OuterDevice outerDevice) {
        outerDevice.work();
    }
}

/**
 * 
 * @author xiongda
 * @date 2018年8月5日
 * @description 创建匿名内部类
 */
public class InnerClassDemo4 {
    public static void main(String[] args) {
        Device device = new Device();
        device.connectTo(new OuterDevice() {

            @Override
            public void work() {
                System.out.println("键盘开始工作!");

            }
        });
        device.connectTo(new OuterDevice() {

            @Override
            public void work() {
                System.out.println("鼠标开始工作!");
            }
        });
    }
}
原文地址:https://www.cnblogs.com/xtuxiongda/p/9425978.html