博客
关于我
java内部类
阅读量:648 次
发布时间:2019-03-15

本文共 2013 字,大约阅读时间需要 6 分钟。

Java 内部类访问规则指南

Java 内部类是一种非常强大的功能,可以在一个外部类中定义多个内部类,并允许其进行特定的操作和访问。然而,内部类的访问规则和限制较为复杂,理解这些规则对编写高质量代码至关重要。本文将详细解析内部类的访问规则、成员访问限制以及注意事项。


一、内部类的访问规则

  • 内部类可以直接访问外部类中的成员

    内部类因为持有外部类的引用,因此可以直接访问外部类中的成员,包括私有方法和变量。这种访问不受成员修饰符(如privateprotectedprotectedpublic)的限制。
    示例:
    外部类 Outer 定义了一个私有成员 private void method() {},内部类 Inner 可以直接调用 method(),无需任何访问权限修饰符。

  • 外部类访问内部类的具体规则

    如果外部类需要访问内部类,必须先创建内部类的对象。对于静态内部类,外部类可以通过类名直接访问;对于非静态(即实例内部类),外部类需要先创建外部类的对象,再通过对象的引用访问内部类。
    示例:

    Outer outer = new Outer();Outer.Inner inner = outer.new Inner();inner.func(); // 可以正常调用

  • 二、成员访问的限制

  • 成员的访问权限与内部类的定义位置

    如果一个内部类定义在外部类的成员位置(如字段或方法中),则这个内部类可以直接被外部类访问。例如,外部类可以通过对象引用调用该内部类的方法或访问其成员。
    注意事项:
    如果内部类定义在局部变量或方法参数中,则该内部类的成员只能被其外部类访问,且不能被局部变量直接访问。

  • static 关键字的作用

    如果一个内部类被 static修饰,则它具备类级别访问的特点。这种内部类可以直接访问外部类中的 static 成员(如静态变量或静态方法),但不能访问外部类的实例成员(如非静态变量或方法)。
    示例:

    static class StaticInner extends Thread {    public void run() {        outerRef=this; // 需添加引用        outerRef하면可以访问静态成员    }}
  • 访问局部变量的限制

    内部类不能直接访问其所在局部变量的值,但可以读取被 final 修饰的局部变量。这种限制是因为局部变量在方法内是不可访问的。
    注意事项:
    如果内部类对局部变量进行修改,必须在局部变量定义前使外部类拥有一个引用。


  • 三、内部类的特殊情况

  • 内部类的非私有性

    如果内部类的定义位置不受成员修饰符限制(即没有被 privateprotected 修饰),则外部类可以直接通过类名引用该内部类。

  • 内部类的封装性

    如果内部类定义在外部类的成员位置,并且被 private 修饰,则外部类无法通过类名或对象引用访问该内部类。这种情况下,外部类需要通过反射机制或其他手段获得内部类的对象。


  • 四、经典的访问atomic错误

    在实际编程中,许多开发者会遇到如下的错误:在外部其他类中直接调用静态内部类的非静态方法。这种做法会导致编译错误,表现为无法访问非静态成员。

    示例代码:

    OtherClass oc = new OtherClass();oc.new StaticInner().func(); // 非静态方法的调用会导致错误

    解决方法:

    如果要在外部类中访问静态内部类的非静态成员,只有在内部类中定义了 static 修饰时才可以通过以下方式调用:

    new Other.StaticInner().func(); // 只有当内部类被 static 修饰时才允许调用非静态成员

    如果内部类未被 static 修饰,则外部类只能访问其静态成员。


    五、局部内部类的特殊性

  • 局部内部类的定义位置

    如果内部类定义在一个方法或初始块中,则该内部类不能被外部类或其他类访问。
    注意事项:

    • 如果局部内部类需要访问外部类的成员,则必须持有外部类的引用。
    • 局部内部类不能访问所在局部变量的值,但可以访问被 final 修饰的局部变量。
  • 局部内部类的成员访问

    局部内部类的成员可以被外部类访问,但不能被局部变量或者其他内部类的方法随意访问。这种限制确保了局部内部类的封装性。


  • 六、总结

    内部类的访问规则虽然复杂,但理解它们可以帮助我们避免常见错误。以下是一些关键点:

    • 内部类可以直接访问外部类的成员,但需要注意成员的访问权限和static修饰。
    • 外部类可以通过对象引用访问内部类(非静态),但需要了解内部类的访问级别。
    • 使用 static修饰内部类可以简化访问规则,但也需要注意其限制。
    • 局部内部类的访问权限受到严格限制,必须持有外部类的引用才能访问外部类成员。

    如果有具体的代码场景或问题,建议通过开发工具或虚拟机进行验证,以确保理解和实践是正确的。

    转载地址:http://wckmz.baihongyu.com/

    你可能感兴趣的文章
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    nginx 1.24.0 安装nginx最新稳定版
    查看>>
    nginx css,js合并插件,淘宝nginx合并js,css插件
    查看>>
    Nginx gateway集群和动态网关
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx Lua install
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    nginx 代理解决跨域
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>