Java 的 内部类

定义

一个类的内部又完整的嵌套了另一个类结构, 被嵌套的类称为内部类(inner class), 嵌套其他类的类被称为外部类(outer class), 是
类的第五大成员

属性, 方法, 构造器, 代码块, 内部类

可以体现类与类之间的包含关系, 内部类的最大的特点就是可以直接访问私有的属性

基本语法

class Outer {
    private int n1 = 100; // 属性

    public Outer(int n1) {
        this.n1 = n1;
    }

    public void m1() {
        System.out.println("m1()方法");
    }
    
    {
        System.out.println("代码块");
    }
    class Inner {
        // 内部类
    }
}

四大分类

局部内部类

定义在外部类局部位置上, 有类名

示例

class Outer {
    private int n1 = 100;
    private void m2() {}
    public void m1() {
        class Inner {
            public void f1() {
                System.out.println("n1= " + n1);
                m2();
            }
        }

        class Inner01 extends Inner {

        }

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

特点

  1. 可以直接访问外部类所有的成员, 包括私有的
  2. 不能添加访问修饰符, 但是可以使用final修饰
  3. 作用域是定义它的方法或者代码块中
  4. 局部内部类 --(直接访问)--> 访问外部类
    外部类 --(通过创建对象)--> 访问局部内部类
  5. 外部其他类无法访问局部内部类
  6. 如果外部类和局部内部类成员重名时遵循就近原则, 如果要访问外部类成员, 可以使用外部类名.this.成员

匿名内部类※

定义在外部类局部位置上, 没有类名

如果某些类只使用一次, 那么可以使用匿名内部类简化

示例1: 基于接口

interface IA {
    public void cry();
}
class Outer {
    private int n1 = 100;
    public void method() {
        // 基于接口的匿名内部类
        IA BBB = new IA() {
            @Override
            public void cry() {
                System.out.println("BBB cry()");
            }
        };
        BBB.cry();
    }
}

特点

  1. BBB 编译类型是IA, 运行类型是匿名内部类XXX
  2. Jdk底层在创建匿名内部类之后, 会立马创建一个对象, 然后返回其地址
  3. 匿名内部类使用一次后就不能再使用

示例2: 基于类

class Outer {
    private int n1 = 100;
    public void method() {
        // 基于接口的匿名内部类
        Father father = new Father("jack") {
            @Override
            public void test() {
                System.out.println("重写test方法");
            }
        };
        father.test();
    }
}

特点

  1. 这个时候其实有了一个匿名内部类继承Father
  2. 这个时候我们就可以对其方法进行重写, 或者进行一些继承的操作
  3. 可以访问外部类的所有成员
  4. 地位和作用域相当于匿名变量
  5. 如果外部类和局部内部类成员重名时遵循就近原则, 如果要访问外部类成员, 可以使用外部类名.this.成员

成员内部类

定义在外部类成员位置上, 没有static修饰

示例

class Outer {
    private int n1 = 100;
    class Inner {
        public void say() {
            System.out.println(n1);
        }
    }
    public void method() {
        Inner inner = new Inner();
        inner.say();
    }
}

特点

  1. 可以直接访问外部类的所有成员, 包括私有的
  2. 可以添加访问修饰符
  3. 外部其他类使用成员内部类的两种方式
  1. Outer.Inner inner = Outer.new Inner(), 也就是通过他的外部类访问内部类, 因为
    这个类是他的成员
  2. 可以在该外部类写一个返回内部类对象的一个方法

静态内部类

定义在外部类成员位置上, 有static修饰

示例

class Outer {
    private int n1 = 100;
    static class Inner {
        public void say() { }
    }
}

特点

  1. 可以直接访问外部类的所有静态成员, 但是不能访问非静态成员
  2. 可以添加任意访问修饰符
  3. 作用域为整个类体
  4. 外部其他类使用静态内部类的方法
  1. Outer.Inner inner = new Outer.Inner(), 因为是静态的, 所以可以直接访问
  2. 编写一个方法, 用来返回静态内部类的对象实例, 这里可以使用静态方法来返回
  1. 成员重名时, 遵循就近原则, 如果想访问外部类成员, 可以使用外部类名.成员 去访问
posted @   Xingon2356  阅读(1)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示