• 内部类可以访问外部类的属性和方法吗?


    注意:

    在内部类构造的时候,会将外部类的引用传递进来,并且作为内部类的一个属性,所以内部类会持有一个其外部类的引用。

    当内部类调用外部类的私有属性时,其真正的执行是调用了编译器生成的属性的静态方法(即acess$0,access$1等)来获取这些属性值。这一切都是编译器的特殊处理。

    外部类可以通过内部类的实例获取私有属性x的操作.

    如何让内部类私有成员不被外部访问

    相信看完上面两部分,你会觉得,内部类的私有成员想不被外部类访问都很困难吧,谁让编译器“爱管闲事”呢,其实也是可以做到的。那就是使用匿名内部类。

    由于mRunnable对象的类型为Runnable,而不是匿名内部类的类型(我们无法正常拿到),而Runanble中没有x这个属性,所以mRunnable.x是不被允许的。


    1 内部类对象的创建依赖于外部类对象;

    2 内部类对象持有指向外部类对象的引用。

    关于内部类如何访问外部类的成员, 分析之后其实也很简单, 主要是通过以下几步做到的:
     
    1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;
     
    2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;
     
    3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。


    java中,匿名内部类可以使用外部类的成员变量吗
    https://segmentfault.com/q/1010000002796833

    细话Java:"失效"的private修饰符 
    http://droidyue.com/blog/2014/10/02/the-private-modifier-in-java/

    深入理解Java中为什么内部类可以访问外部类的成员 
    http://blog.csdn.net/zhangjg_blog/article/details/20000769

  • 相关阅读:
    CF446C [DZY loves Fibonacci]
    [BZOJ2286] 消耗战
    [CF Round #278] Tourists
    BZOJ2553 [BJWC2011]禁忌
    NOI2018D2T1 屠龙勇士
    BZOJ2333 棘手的操作
    bzoj4196: [Noi2015]软件包管理器(树链剖分)
    bzoj1833: [ZJOI2010]count 数字计数(数位DP)
    bzoj1026: [SCOI2009]windy数(数位DP)
    bzoj3631: [JLOI2014]松鼠的新家(树上差分)
  • 原文地址:https://www.cnblogs.com/bluestorm/p/5867058.html
Copyright © 2020-2023  润新知