`

Java内部类的可见性问题

 
阅读更多

关于Java的内部类的可见性问题,平时并未太注意。不过使用时,其实还是应该明确一点:就是关于内部类和他的外部类的可见性问题:private这种修饰符并不能阻止外部类直接访问到内部类中的private属性;反之亦然。

这里直接看代码会更清楚一些:

 

public class VisibilityTest {

    private String outerName;

    public String showInnerName(InnerClass innerClass){
        // Notice : innerName in InnerClass is "private"
        // But here can be accessed directly without using any public getter.
        return innerClass.innerName;
    }

    private static class InnerClass{
        private String innerName;
        // Notice : outerName in VisibilityTest is "private"
        // But here can be accessed directly without using any public getter.
        public String showOuterClass(VisibilityTest visibilityTest){
            return visibilityTest.outerName;
        }
    }

}

上面的代码不会有任何编译错误,事实上在Java中也是完全合法的。

关于内部类这种可见性的特点,在内部类访问外部类属性或者在外部类访问内部类属性,都相对来说更方便。

一个典型的应用场景是:在利用内部类实现懒加载方式的单例模式,具体可以参考这里。 

 

分享到:
评论

相关推荐

    探讨Java内部类的可见性

    这里需要探讨的是,外部类以及其他类的对象可以如何访问到某个内部类对象,即内部类的可见性问题。  下面是一个示例程序Out.java,其中包含了4个不同访问权限的内部类(private,default,protected,public),...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    11.2.2 类的可见性 293 11.2.3 final——让类不可被继承 295 11.2.4 理解final关键字 296 11.2.5 总结:类的修饰符 297 11.3 方法的修饰符 297 11.3.1 方法的访问控制符 298 11.3.2 public:没有限制的修饰符 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    11.2.2 类的可见性 293 11.2.3 final——让类不可被继承 295 11.2.4 理解final关键字 296 11.2.5 总结:类的修饰符 297 11.3 方法的修饰符 297 11.3.1 方法的访问控制符 298 11.3.2 public:没有限制的修饰符 ...

    java 编程入门思考

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    Java初学者入门教学

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    java联想(中文)

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    JAVA_Thinking in Java

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    Thinking in java4(中文高清版)-java的'圣经'

    2.4.2 基本成员默认值 2.5 方法、参数和返回值 2.5.1 参数列表 2.6 构建一个Java程序 2.6.1 名字可见性 2.6.2 运用其他构件 2.6.3 static 关键字 2.7 你的第一个J ava程序 编译和运行 2.8 注释和嵌入式文档 2.8.1 ...

    Thinking in Java简体中文(全)

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    java 异常总结

    当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。 java.lang.IncompatibleClassChangeError 不兼容的类变化错误。当正在执行的方法所依赖的类定义发生...

    Thinking in Java 中文第四版+习题答案

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记...

    Thinking in java(中文)

    类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    Think in Java(中文版)chm格式

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 ...

    [java]读书笔记整理:一切都是对象

    作用域决定了在其内定义的变量名的可见性和生命周期。在C,C++和java中,作用域由花括号的位置决定。例如: { int x=12; //只有x 可用 { int y=100; //x,y 都可用 } //只有x 可用 //y ...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档...

    超爽的自学课件(java)

    本章也向大家介绍了Java 1.1的“内部类”。 <br>(8) 第8章:对象的容纳 对一个非常简单的程序来说,它可能只拥有一个固定数量的对象,而且对象的“生存时间”或者“存在时间”是已知的。但是通常,我们的程序...

    spring-gradle-kotlin-multimodule:Spring-boot Gradle多模块项目展示了使用Kotlin可见性修改器在模块之间进行的隔离(内部)

    这是通过利用内部Kotlin可见性修饰符来完成的,该修饰符将可见性限制在当前模块的范围内(与Java的程序包保护相比,它提供了更多的隔离性-考虑有意创建与依赖于访问其程序包保护类的依赖项相同的程序包) 。...

    基于Java的XML解析与反射设计模式.doc

    和其他序列化工具相比,xstream 有三个突出的特点: xstream不关心序列化/逆序列化的类的字段的可见性。 序列化/逆 序列化类的字段不需要getter和setter 方法。 序列化/逆序列化的类不需要有默认构造函数。 不需要...

Global site tag (gtag.js) - Google Analytics