zoukankan      html  css  js  c++  java
  • 内部类可以访问外部类的属性和方法吗?

    注意:

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

    当内部类调用外部类的私有属性时,其真正的执行是调用了编译器生成的属性的静态方法(即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

  • 相关阅读:
    docker使用
    解决wps linux中文字体名字全是英文
    解决小程序云函数操作数据库回调不执行
    解决XP“不是有效Win32程序” 不是改Platform toolset
    [hdu1686] Oulipo【KMP】
    [poj 2104] K-th Number【主席树】
    bzoj2806 [Apio2012]dispatching【可并堆】
    bzoj1492 [NOI2007]货币兑换Cash【cdq分治】
    [coci2015-2016 coii] torrent【树形dp 二分】
    [coci2015-2016 coii] Palinilap【字符串 哈希】
  • 原文地址:https://www.cnblogs.com/bluestorm/p/5867058.html
Copyright © 2011-2022 走看看