作用
- 提供了更好的封装。只能让外部类直接访问,不能让其他所有类访问。
- 内部类可以直接访问内部类的私有属性,但外部类不能访问内部类的属性
- 在外部类的某个方法中new一个内部类对象之后,可以用这个内部类对象直接访问内部类的似有属性。
分类
非静态内部类(和平时使用的其他类没什么不同)(上一级是成员内部类,除了成员内部类还有局部内部类,即定义在方法内的类,极少用)
- 非静态内部类寄存于外部类对象,定义了外部类对象才会有内部类。
- 不能有静态成员,因为静态成员从属于类,而内部类从属于对象(Java类加载顺序:先加载类,同时执行static变量初始化,并将其加载到方法区;内部类则必须在外部类实例化后才被加载,而JVM要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。不过为什么可以有静态常量呢?因为常量放在常量池中,加载常量是不需要加载类的)。
静态内部类
- 但一个静态内部类的对象存在,并不一定存在对应的外部类对象。因此不能调外部类的非静态成员,因为外部对象都不一定有。
- 静态内部类看作外部类的一个静态成员,可以直接作为一个普通类来使用,而不需实例一个外部类。
内部接口不管写不写static它都是static的。
匿名内部类
//模板设计模式 subFiles =src.listFiles(new FilenameFilter(){ //FilenameFilter是个接口,只包含accept()一个方法声明 @Override /** * 重写了文件过滤器,返回为真时才将文件挑选出来,否则将剔除出listFiles * dir 代表src */ public boolean accept(File dir, String name) { //System.out.println(dir.getAbsolutePath()); return new File(dir,name).isFile()&&name.endsWith(".java"); } });
特点
- 只能使用一次
当你想使用一个类的protected 方法时,但是又不和这个类在同一个包下,你是没办法调用的。
这时候匿名类就派上用场了,你可以声明一个匿名类继承该类,并定义一个方法,在这个方法内使用super调用你想调用的那个方法(其实你也可以写个类继承这个类,就能调用父类的protected方法了,但是匿名类更简洁,因为你只想调用这个方法而已)举个栗子
总结
反正两种都不能调与自己静态性相反的外部类成员