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

灵魂拷问:Java部类如何访问部类私有对象

innerName); } public innerClass(String innerName){ this.innerName = innerName; } } } 这是我简单手写一个外部类嵌套一个内部类...当我编译这段代码javac OutClass.java ? 可以看出会生成两个.class字节码文件,内部类类名是外部类类名$内部类类名 然后对这个两个字节码文件反编译看看javap ?...编译器小哥偷偷做了一些不可告人事情,首先,内部类多了个常量引用,准备指向着外部类,而且又偷偷修改了构造方法。传递一个OutClass类型参数进去。这样内部类就拿到了外部类引用。...将指向外部类引用作为参数给那三个外部类静态方法 然后我们去反编译看看那三个静态方法怎么实现 又是祭出伟大反编译工具 ? 看得出,这三个方法都是返回外部类对应私有属性!...结论 在虚拟机没有外部类部类之分都是普通类,但是编译器会偷偷做点修改,让内部类多一个常量引用指向外部类,自动修改内部类构造器,初始化这个常量引用,而外部类通过扫描内部类调用了外部类那些私有属性

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

java部类作用(二)----隐藏作用

1.局部类隐藏作用 局部内部类:是指在方法函数中去定义一个内部类。 局部内部类有一个优势:即对外部世界完全可以隐藏起来,在这个方法类其它方法或者代码都不能调用这个内部类。...A一个方法,任何人都都休想访问我,我对外部世界是完全隐藏,只有start()方法有权限操作我"); } } A a = new A(); a.print(); <span...A,如果想要访问,我必须先经过start(),我必须拥有调用start()方法权限"); } } 内部类 class A作用域被限定在{ }表示 局部内部类不能用...注意:一般局部内部类只有在当整个应用程序代码中使用了一次时候,就可以放在局部。 当然也可以根据它这个隐藏作用去设置自己代码。因为局部内部类只有定义它方法知道,其他的人都无权干涉。...3.隐藏作用体现在:内部类可以对同一个包其他类隐藏起来 这个很好解释,我们只可以用谁定义了这个内部类部类去使用这个内部类 直接看代码,标注红色部分: ?

91030

如何理解Java隐藏与覆盖

发生在子类于父类之间,是指在子类与父类之间或在同一类定义具有相同方法名,访问权限等方发。 区别在于返回类型或参数列表。...两同两小一大 发生在子类与父类之间,指在在子类声明一个和父类具有相同方法名,参数列表,返回值,访问权限等方法,即在子类重新编写方法实现功能。...子类实例变量/静态变量可以隐藏父类实例/静态变量,总结为变量可以交叉隐藏 隐藏和覆盖区别:   被隐藏属性,在子类被强制转换成父类后,访问是父类属性   被覆盖方法,在子类被强制转换成父类后...两同两小一大 发生在子类与父类之间,指在在子类声明一个和父类具有相同方法名,参数列表,返回值,访问权限等方法,即在子类重新编写方法实现功能。...子类实例变量/静态变量可以隐藏父类实例/静态变量,总结为变量可以交叉隐藏 隐藏和覆盖区别:   被隐藏属性,在子类被强制转换成父类后,访问是父类属性   被覆盖方法,在子类被强制转换成父类后

3.1K10

Java部类与匿名内部类详解

文章目录 内部类 什么是内部类 成员内部类 访问特点 匿名内部类 前提 格式 使用方式 内部类 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。...比如,电脑类Computer 包含中央处理器类Cpu ,这时, Cpu 就可以使用内部类来描述,定义在成员位置。...代码举例: class Computer { //外部类 class Cpu { //内部类 } } 访问特点 内部类可以直接访问部类成员,包括私有成员。...外部类访问部类成员,必须要建立内部类对象。...比如,PersonHeart.class 匿名内部类 匿名内部类 :是内部类简化写法。它本质是一个带具体实现父类或者父接口 匿名 子类对象。开发,最常用到部类就是匿名内部类了。

1.4K30

Java嵌套类、内部类、静态内部类

参考链接: Java嵌套类 在Java我们在一个类内部再定义一个类,如下所示:  class OuterClass {     ...    ...内部类实例对象都会绑定一个外围类实例对象,并且InnerClass可以访问其所绑定OuterClass所有成员属性以及方法,包括私有成员属性以及方法。...在InnerClass通过OuterClass.this 显式 引用其所绑定OuterClass实例。...这样innerObject就可以访问outerObject所有成员属性以及方法了。  那如果想直接跳过外围类去初始化内部类会怎么样呢?...由于静态嵌套类没有像内部类那样绑定外部类对象,所以也就不存在静态嵌套类不能访问其外围类成员这种说法。

1.6K50

java部类总结

、肢体、器官等身体结果组成,而内部类相当于其中某个器官之一,例如心脏:它也有自己属性和行为(血液、跳动) 显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类 而心脏又在人体当中,正如同是内部类在外部当中...,因为内部类作用就是为了访问部类成员变量 实例2:内部类变量访问形式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17...:13 外部类变量:12 从实例1可以发现,内部类在没有同名成员变量和局部变量情况下,内部类会直接访问部类成员变量,而无需指定Out.this.属性名 否则,内部类局部变量会覆盖外部类成员变量...,那么内部类就只能访问部类静态成员变量,具有局限性 其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类对象(通过类名访问static,生不生成外部类对象都没关系...我们将内部类移到了外部类方法,然后在外部类方法再生成一个内部类对象去调用内部类方法 如果此时我们需要往外部类方法传入参数,那么外部类方法形参必须使用final定义 至于final在这里并没有特殊含义

41730

Java 匿名内部类如何使用外部成员

在开发过程,由于习惯原因,我们可能对某种编程语言一些特性习以为常,特别是只用一种语言作为日常开发情况。...现象描述 在 Java 8 之前,匿名内部类在使用外部成员时候,会报错并提示 “Cannot refer to a non-final variable arg inside an inner class...defined in a different method”: 但是在 Java 8 之后,类似场景却没有再提示了: 难道是此类变量可以随便改动了吗?...,只不过编译器生成它构造方法时候,除了将外部类引用传递了过来,还将基本数据类型变量复制了一份过来,并把引用数据类型变量引用也传递了过来。...情景对比 但是为什么对于 Kotlin 来说可以在匿名内部类中直接修改基本数据类型值呢?

81420

在 Laravel 动态隐藏 API 字段方法

在这个例子,让我们假设在用户列表,我们只想要所有用户名字,而在用户显示,我们只想隐藏电子邮件地址。 <?...现在我们可以访问 http://api.dev/api/users/1 ,你会发现响应已经没有id 字段了。 { "data": { "name": "Mr....现在我们访问 http://api.dev/api/users 看到返回结果没有了 id 和 email 字段了如在 UsersController 指定方法 . { "data": [{ "...我不推荐过度重复去请求API资源,因为它很可能会把简单事情变得更加复杂,所以说在请求时候隐藏某些特定字段是更简单、更合理解决方案。...以上所述是小编给大家介绍在 Laravel 动态隐藏 API 字段方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

5.4K31

部类只能访问final局部变量_java部类引用外部变量

因为在JDK8之前,如果我们在匿名内部类需要访问局部变量,那么这个局部变量必须用final修饰符修饰。这里所说匿名内部类指的是在外部类成员方法定义部类。...既然是在方法创建部类,必然会在某些业务逻辑中出现访问这个方法局部变量需求。那么我们下面就会研究这种情况。 为什么java语法要求我们需要用final修饰呢?...,是因为在底层将这个局部变量值传入到了匿名内部类,并且以匿名内部类成员变量形式存在,这个值传递过程是通过匿名内部类构造器完成。...这里举个栗子:原先局部变量指向是对象A,在创建匿名内部类后,匿名内部类成员变量也指向A对象。但过了一段时间局部变量值指向另外一个B对象,但此时匿名内部类还是指向原先A对象。...那现在我们来谈一谈JDK8对这一问题知识点。在JDK8如果我们在匿名内部类需要访问局部变量,那么这个局部变量不需要用final修饰符修饰。

91020

Java部类如何实现

部类(inner class)是定义在另一个类类。 内部类方法可以访问该类定义所在作用域中数据,包括私有的数据。...内部类可以对同一个包其他类隐藏起来 当想定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷。 以下简单举例: ?...语法和用法大家很容易就学会了,那么内部类如何实现直接访问其他类私有成员变量呢?我们知道Java私有成员变量只有类实例本身能访问。...内部类将通过这种方式持有外部类。 内部类一个特性是可以访问外部私有成员变量,这又是如何做到呢。...public或private访问说明符进行说明,它作用被限定在声明这个局部类

71720

java匿名内部类总结

匿名内部类也就是没有名字部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法...something"); } }; p.eat(); } } 运行结果:eat something 可以看到,我们直接将抽象类Person方法在大括号实现了...,那么其子类方法都可以使用匿名内部类来实现 最常用情况就是在多线程实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口 实例4:Thread类匿名内部类实现 public...} }; Thread t = new Thread(r); t.start(); } } 运行结果:1 2 3 4 5 文章转载于:java...匿名内部类总结

90830

Java4种内部类

Java四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 1. 成员内部类:作为类成员,存在于某个类内部。   ...test2();//调用外部类非静态方法 System.out.println(a + b);//访问部类静态成员变量和非静态成员变量...成员内部类对象必须通过外部类对象创建 in.test(); } } Console: 在成员内部类方法 调用外部类静态方法 调用外部类非静态方法 4 2.静态内部类...局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存删除。   必须注意:如果局部内部类要使用他所在方法局部变量,那么就需要将这个局部变量定义为final。..."); } }); } }  java绝大多数情况下,类访问修饰符只有public和默认这两种,但也有例外。

23030

java部类----安全问题-----访问外围类私有变量

我们知道如果一个变量是私有的,它应该就不希望别人去访问它。 隐秘访问方法需要拥有包可见性,所有攻击代码需要与被攻击类放在同一个包。...当使用了内部类时候,编译器做了这样一件事: 它在外围类添加了一个静态方法  static boolean access$0(外部类); 内部类方法将调用这个函数 这个是有风险,因为任何人都可以通过access...$0方法很容易读取到外围类私有域 黑客可以使用十六进制编辑器轻松创建一个用虚拟机指令调用这个函数类文件。...结论就是: 如果内部类访问了私有数据域,就有可能通过附加在外围类所在其他类访问它们。 请慎用!

1.5K20

如何Java避免equals方法隐藏陷阱(一)

常见等价方法陷阱 java.lang.Object 类定义了equals这个方法,它子类可以通过重载来覆盖它。不幸是,在面向对象写出正确equals方法是非常困难。...事实上,在研究了大量Java代码后,2007 paper作者得出了如下一个结论: 几乎所有的equals方法实现都是错误! 这个问题是因为等价是和很多其他事物相关联。...而是一种变化了重载。在Java重载被解析为静态参数类型而非运行期类型,因此当静态参数类型是Point,Pointequals方法就被调用。...不同哈希码导致他们具有极高可能性被放入到集合不同哈希桶。contains方法将会去找p2哈希码对应哈希桶匹配元素。...如果两个对象根据equals(Object)方法是相等,那么在这两个对象上调用hashCode方法应该产生同样值 事实上,在Java,hashCode和equals需要一起被重定义是众所周知

1.7K80

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券