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

    你可能感兴趣的文章
    npm设置镜像如淘宝:http://npm.taobao.org/
    查看>>
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>
    npm错误Error: Cannot find module ‘postcss-loader‘
    查看>>
    npm,yarn,cnpm 的区别
    查看>>
    NPOI
    查看>>
    NPOI之Excel——合并单元格、设置样式、输入公式
    查看>>
    NPOI初级教程
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NPOI在Excel中插入图片
    查看>>
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>
    nrm报错 [ERR_INVALID_ARG_TYPE]
    查看>>