首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

灵魂拷问:Java内部类是如何访问外部类私有对象的?

可以看出会生成两个.class字节码文件,内部类的类名是外部类类名$内部类类名 然后对这个两个字节码文件反编译看看javap ?...编译器小哥偷偷的做了一些不可告人的事情,首先,内部类中多了个常量引用,准备指向着外部类,而且又偷偷修改了构造方法。传递一个OutClass类型的参数进去。这样内部类就拿到了外部类的引用。...这个时候我做了个方法的测试呀,我们都知道,内部类使用外部类的属性用过外部类类名.this.属性名,所以我写了个测试方法fun public void fun(){ System.out.println...不过对于这点我还有点要说明,编译器很智能,它会扫描内部类,查看是否调用的外部类的私有属性,只有调用了才会生成对应的acess$xxx方法!...结论 在虚拟机中没有外部类内部类之分都是普通的类,但是编译器会偷偷的做点修改,让内部类中多一个常量引用指向外部类,自动修改内部类构造器,初始化这个常量引用,而外部类通过扫描内部类调用了外部类的那些私有属性

2.6K10

数据访问对象模式

数据访问对象模式 数据访问对象模式Data Access Object Pattern即DAO模式,用于把低级的数据访问API或操作从高级的业务服务中分离出来,准确来说数据访问对象模式不属于通常定义的设计模式范畴...,但数据访问对象模式是一种非常有用的数据访问管理构建技巧。...描述 数据访问对象模式就是对数据源的访问与存储进行封装,提供一个数据访问对象类负责对存储的数据进行管理和操作,规范数据存储格式,类似于后台的DAO层。...具体格式项目组可以自己定义,主要是便于管理,防止出现冲突,在前端方面其实主要是对于本地存储进行了一次封装,用以进行一个规范性约束,约定好规范后就可以开始定义数据访问对象了。...实现 /** * LocalStorage数据访问类 * @param {string} prefix Key前缀 * @param {string} timeSplit 时间戳与存储数据之间的分割符

63010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 方法 | 类内部访问私有成员 )

    一、访问私有成员 1、对象无法访问私有变量 在下面的 Python 类 Student 中 , 定义了私有的成员变量 , # 定义私有成员 __address = None 该私有成员变量..., 只能在类内部进行访问 , 类的外部无法进行访问 ; 在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ; 使用 实例对象 访问 类的私有成员 , 编译时不会报错...__address) 访问 s1 实例对象 的 __address 成员 , 会报如下错误 ; 代码示例 : """ 面向对象 - 封装 """ # 定义 Python 类 class Student...() AttributeError: 'Student' object has no attribute '__say' Process finished with exit code 1 3、类内部访问私有成员...__say() 最终的执行结果为 : Tom is 18 years old , address is 学院路6号 address is 学院路6号 完整代码示例 : """ 面向对象 - 封装 """

    28220

    对象、消息、运行期--7:在对象内部尽量直接访问实例变量

    在fullName的获取方法和设置方法中,使用点语来访问相关属性 #import @interface Person : NSObject @property...,直接访问属性 #import "Person.h" @implementation Person - (void)setFullName:(NSString *)fullName{ NSArray...fullName{ return [NSString stringWithFormat:@"%@-%@",_firstName,_lastName]; } @end 这俩种写法区别: 直接访问属性的速度比较快...这种情况下,编译器所生成的代码会直接访问保存属性的那块内存 直接访问属性时,不会调用其setter方法 直接访问属性,不会触发KVO通知 通过属性来访问有助于排查与之相关的错误 读取属性的时候采用直接访问的形式...设置属性的时候通过属性处理 参考 Effective+Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法

    15910

    kubernetes内部访问服务的方式

    最近因为实验室集群整体爆炸,需要修改旧服务器的网络配置。为此,需要进行一系列的网络测试。同时,这也是一个新的label系列。总是有一些代码,非常常用,但是用的时候就是找不到,想也想不起来,就非得去查。...为此,我总结了几个比较好的快速访问方式 方式1 最直接的方式肯定是登陆进服务内部,比如istio中提到的 在执行命令后:kubectl apply -f samples/bookinfo/platform...--连接两条不同的命令,后面就不需要过多的解释了。...9080/ratings/1 {"id":1,"ratings":{"Reviewer1":5,"Reviewer2":4}} 方式2 临时开一个curl镜像进行网络检查 官方在httpbin里也展示了如何通过...Never dummy --image=dockerqa/curl:ubuntu-trusty --command -- curl --silent httpbin:8000/delay/5 网络测试的对象

    81730

    设计模式-数据访问对象模式

    数据访问对象模式是什么? 数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。...以下是数据访问对象模式的参与者。 角色: 数据访问对象接口(Data Access Object Interface):该接口定义了在一个模型对象上要执行的标准操作。...数据访问对象实体类(Data Access Object concrete class): 该类实现了上述的接口。...缺点: 代码量增加:当然增加一层需要增加相应的代码,不过该缺点可以忽略,可以使层次更清晰嘛。 数据访问对象模式可以干嘛?...主要解决jsp时代的一个痛点,层次更清晰,并且各层职责明确,dao就是与数据交互而产生的。 个人理解: 数据访问对象模式就是mvc中的dao层,主要与数据库交互。 数据访问对象模式类图 ?

    86730

    jvm对象的访问

    对象的内存布局 在 HotSpot虚拟机中,对象在内存中存储的布局分为三块区域:对象头,实例数据,和对齐填充。...对象的访问 当我们使用对象时,我们需要通过虚拟机栈上的reference数据(即worker)来操作堆上的具体对象。...而句柄池中包含了对象实例数据和类型数据具体的地址信息,如下图: ?...两种方式的比较 使用句柄池来访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时整体空间位置)时只会改变句柄中的实例数据指针,而reference不需要任何改变。...使用直接指针访问最大的好处就是快,节省了一次指针定位的时间开销,由于对象访问在java中非常频繁,积少成多,节省这样的开销效益非常可观。

    81120

    面向对象中的内部类

    } } 1.2、访问 1.2.1、创建内部类对象 外部类名.内部类名 对象名 = new 外部类型().new 内部类型(); 或 外部类名.内部类名 对象名 = 外部类对象....new 内部类型(); 1.2.2、访问特点 内部类可以直接访问外部类的成员,包括私有成员。...外部类要访问内部类的成员,必须要建立内部类的对象。... m.start(); } } 运行结果: 2、局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内...静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非

    97920

    java内部类和静态内部类区别_静态内部类对象的创建

    从之前的学习中,我们应该对静态这个关键字有一定的了解,静态代表它是属于类的,而不是属于实例的。我们可以通过类名直接对静态的玩意儿直接进行引用,但这里的Node静态内部类却是私有的。...为了找到静态内部类和普通内部类的区别,我使用jad工具,自己重写一个类似的Node类,对其进行反编译后发现: 普通内部类版本: private class List$Node { List...,存在一个隐藏的外部类引用字段,在构造内部类时,用于指向外部类的引用。...每次生成一个非静态的内部类实例,都会有这样的操作。 恰巧Node类只是外部类的一个组件,他不需要引用外部类的任何字段,所以,把它声明成静态的能减小不必要的消耗。...所以,在定义一个内部类时,如果该内部类不需要引用外部类的非静态属性/方法,则应该将它声明为静态的。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    65810

    如何在CVM实例中访问对象存储

    域名解析如果CDC与公有云已经打通数据通道,可以使用公有云的DNS进行解析。如果数据通道没有打通,或者客户要使用自己的DNS解析服务,那么需要做域名解析配置。2.1.....myqcloud.com这样的格式,还请指导一下。3. 存储桶权限配置CDC中对象存储默认是私有读写权限,客户可以通过API的方式进行访问。...但是客户如果要用对象文件的网络地址直接下载,则需要添加匿名访问权限,操作如下。l 打开存储桶,进入 「Policy权限设置」 页面l 点击页面中 Policy权限设置 中的 添加策略 链接。...l 根据要做的控制进行设置,如下截图是设置匿名访问的一个示例。l 点击完成后权限生效,就可以在CVM实例中直接通过对象的域名进行下载。4....包括部分 HTTP 标准属性(HTTP Header)以及以 x-cos-meta- 开头的用户自定义元数据(User Meta)。

    3.4K40

    JAVA的对象访问定位

    创建对象是为了访问对象,Java程序通过栈的引用(reference)数据来操作堆上的对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用。...并没有规定通过该引用怎么定位,访问堆中的对象。具体需要看虚拟机的实现。...两种访问方式: 句柄访问 直接访问 句柄访问 Java堆中会划分一个句柄池,reference存储的就是对象的句柄地址,而句柄中存放的是对象的实例数据和类型数据的地址信息。...[image-20201023232424966] 直接访问 Java堆对象布局就必须考虑如何存放访问类型数据的相关信息,reference存储的就是对象的地址。...[image-20201023232718060] 句柄访问和直接访问的特点 句柄访问:reference存放的是句柄地址(比较稳定),在对象移动时(垃圾回收),只会改变句柄中实例数据的地址,而reference

    1.2K00

    Java虚拟机值对象访问以及如何使用对象的引用(2)

    另外,在 Java 堆中还必须包含能查找到此对象类型数据(如对象类型、父类、 实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。...既然java栈中的是对象的引用,那么我们如何使用对象那,主流的访问方式有两种:使用句柄和直接指针。...(1)使用句柄: 如果使用句柄访问方式, Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息,如图: ?...(2)直接指针 如果使用直接指针访问方式, Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息, reference 中直接存储的就是对象地址,如图: ?...这两种对象的访问方式各有优势,使用句柄访问方式的最大好处就是 reference 中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference

    2.8K10

    java 对象的访问定位

    建立对象就是为了使用对象,我们的Java程序需要通过栈上的reference 数据来操作堆上的具体对象。...由于reference类型在Java虚拟机中只规定了一个指向对象的引用,并没有定义整个引用应该如何去定位,访问堆中的对象的具体位置。所以对象访问方式取决于虚拟机实现而定的。...目前主流的访问方式有使用句柄和直接指针两种。 一:句柄:是间接访问对象实例数据的一种方式:采用句柄池的方式。...存放的是:到对象实例数据的指针,然后通过到对象实例数据的指针,访问Java堆中实例池中的对象实例数据。 ? 优势:reference存储的是稳定的句柄地址。在对象移动时只会改变句柄中的实例数据指针。...二:直接指针访问: ? 优势:速度更快。节省了一次指针定位的时间开销。

    1.3K10

    如何在JavaScript中访问暂未存在的嵌套对象

    其中之一就是当你试图访问嵌套对象时,会遇到这个错误 Cannot read property 'foo' of undefined 在大多数情况下,处理嵌套的对象,通常我们需要安全地访问最内层嵌套的值。...user.personalInfo.name : null; 如果你的嵌套结构很简单,这是可以的,但是如果数据嵌套五或六层深,那么你的代码就会看起很混乱: let city; if ( data...Oliver Steele的嵌套对象访问模式 这是我个人的最爱,因为它使代码看起来干净简单。 我从 stackoverflow 中选择了这种风格,一旦你理解它是如何工作的,它就非常吸引人了。...做法是检查用户是否存在,如果不存在,就创建一个空对象,这样,下一个级别的键将始终从存在的对象访问。 不幸的是,你不能使用此技巧访问嵌套数组。...除了安全访问嵌套对象之外,它还可以做很多很棒的事情。

    8.1K20

    内部类(来自类和对象的补充)

    内部类可以访问外部类的所有成员,包括私有成员。内部类提供了一种封装和组织代码的方式,可以将相关的类和接口放在一起,增加代码的可读性和可维护性。...所以实例内部类的实例化需要先创建外部类的实例,然后再通过外部类的实例来创建实例内部类的对象。...成员方法跟成员变量同理 ❤️❤️而在外部类中我们不能直接访问实例内部类的成员,需要通过创建实例内部类的对象再引用访问。...所以因为静态内部类的创建不需要先创建外部类,我们往往用静态内部类比实例内部类多一点。 3. 静态内部类可以直接访问外部类的静态成员,但不能直接访问外部类的非静态成员。...如果需要访问外部类的非静态成员,可以通过在内部类中创建外部类的对象来实现。

    7210

    PHP- 复合数据类型-对象的访问控制

    在 PHP 中,我们可以使用访问控制关键字public、protected和private来控制对象的属性和方法的访问权限。这些关键字决定了哪些成员可以被外部访问,哪些成员只能在类内部访问。...具体的访问控制规则如下:public成员可以被任何代码访问,包括类内部、类外部和子类中。protected成员可以在类内部和子类中被访问,但在类外部无法被访问。...private成员只能在类内部被访问,包括子类中也无法访问。访问控制修饰符后面跟着的属性或方法就会受到这个访问控制的限制。...在 Employee 类中,我们定义了一个 showInfo() 方法,它可以调用 Person 类中的公共和受保护的方法来显示信息,但不能调用私有方法。...在示例代码的最后,我们创建了一个 Person 对象和一个 Employee 对象,分别用来演示访问公共、受保护和私有属性和方法的限制。

    39420
    领券