博客
关于我
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/

    你可能感兴趣的文章
    Node.js高级编程:用Javascript构建可伸缩应用(1)1.1 介绍和安装-安装Node
    查看>>
    nodejs + socket.io 同时使用http 和 https
    查看>>
    NodeJS @kubernetes/client-node连接到kubernetes集群的方法
    查看>>
    NodeJS API简介
    查看>>
    Nodejs express 获取url参数,post参数的三种方式
    查看>>
    nodejs http小爬虫
    查看>>
    nodejs libararies
    查看>>
    nodejs npm常用命令
    查看>>
    nodejs npm常用命令
    查看>>
    Nodejs process.nextTick() 使用详解
    查看>>
    NodeJS yarn 或 npm如何切换淘宝或国外镜像源
    查看>>
    nodejs 中间件理解
    查看>>
    nodejs 创建HTTP服务器详解
    查看>>
    nodejs 发起 GET 请求示例和 POST 请求示例
    查看>>
    NodeJS 导入导出模块的方法( 代码演示 )
    查看>>
    nodejs 开发websocket 笔记
    查看>>
    nodejs 的 Buffer 详解
    查看>>
    NodeJS 的环境变量: 开发环境vs生产环境
    查看>>
    nodejs 读取xlsx文件内容
    查看>>
    nodejs 运行CMD命令
    查看>>