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

  • 相关阅读:
    设计模式的原则
    命令模式
    访问者模式
    策略模式
    外观模式
    组合模式
    原型模式
    合并有序数组
    判断二叉树是否对称
    中序遍历二叉树
  • 原文地址:https://www.cnblogs.com/bluestorm/p/5867058.html
Copyright © 2011-2022 走看看