作用

  • 提供了更好的封装。只能让外部类直接访问,不能让其他所有类访问。
  • 内部类可以直接访问内部类的私有属性,但外部类不能访问内部类的属性
  • 在外部类的某个方法中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方法了,但是匿名类更简洁,因为你只想调用这个方法而已)

    举个栗子

    总结

    反正两种都不能调与自己静态性相反的外部类成员