您的位置 首页 java

什么是Java 9中的私有?

在进行面试时,我体会到大多数候选人不知道Java中的私有修饰符是什么意思。他们知道这一点,这对于日常编码是足够的,但知识通常远没有完成。这不成问题。知道够了,呃…够了 但是,了解 java 的一些内部工作仍然很有趣。在一些罕见的情况下,可能会揭示一些细节。如果没有别的,它是有趣的.orElse(whyDoYouReadIt)?

顺便说一下:提到访谈是一个写ran子的好机会,即使在我看来,与我个人有关的言论和含义是虚假的。毕竟,我的人并不重要,并且把自己与批评我的事实隔离开来,我觉得这篇文章很有趣。这样一来,关于采访的结论很重要,我可能会发现,其实完全符合我的意见。

本文是为了描述一些Java事实,希望比阅读语言标准更可读。

那么什么是私人?

private 是Java中的访问修饰符。如果您有一个类的私有成员(方法,字段,内部或嵌套类或嵌套接口),则只能由同一个类中的代码使用。有趣的问题是:当私有方法有多个类时,会发生什么?如何在多个班上呢?如果有一个类包含另一个类,并且内部/嵌套类中有一个私有方法,那么它在内部/嵌套类中,也在顶级类中。

封闭类中的私有方法可以从外部类调用吗?可以在封闭的类中编写一个外部类中的私有方法?在这两种情况下,答案是肯定的。示例代码…

包 javax0.package1; TopLevelClass 类 { void topMethod () { 

…清楚地显示了这种情况:嵌套类NestedClass和嵌套接口NestedInterface都包含可以访问包含私有字段z的外部类的代码。类似地,顶级类代码可以调用嵌套类中的私有方法。在这种情况下,此示例代码实际上不执行任何合理的事实并不重要。

如果我们编译这个单一的 源文件 ,我们得到三个类文件:

  1. TopLevelClass $ NestedClass.class

  2. TopLevelClass $ NestedInterface.class

  3. TopLevelClass.class

那是因为 JVM 不知道顶层是什么,什么是嵌套的。JVM不知道有关嵌套和顶级类的任何内容。对于JVM,类只是一个类。一个顶级的课,如果你坚持。这主要是因为Java语言1.0没有嵌套和内部类,并且JVM是根据设计的。当在Java 1.1中引入内部和嵌套类时,编译已被修改 – 但是只有内部和嵌套类才保留直接由JVM处理的语言特性。

顶级类如何在嵌套在源代码中的另一个类中访问一个私有方法,但是当它被编译时,它只是另一个“顶级”类?他们在同一层面。如果可访问性更改为public,那么我们也可以从其他类访问它,但是我们不能。编译器不允许其他类中的任何其他代码访问私有方法,即使我们做了一些技巧来克服编译器,生成的类文件将使JVM抛出异常。Java中的私有是私有的。

真正发生的是编译器生成特殊的getter和setter方法来访问字段z。

为从同一顶级类中的不同类访问的每个专用字段或方法创建此类桥接方法。如果私有的任何从封闭类没有访问,则不会生成该方法。如果仅读取字段,则仅生成吸气剂。如果只从外部设置,则只生成设置器。

这也是一个有趣的失败 – 认为私人领域(或任何)只能从同一个对象内访问。这是我们在编程时使用这些成员的通常方法,但是如果代码具有对另一个相同类型的实例的引用,那么通过该引用,我们可以访问另一个对象的私有字段,以及我们可以访问“我们自己”的领域。这是罕见的情况吗?你可能会这么想,因为你很少编程。但实际上,这是非常频繁的:IDE通常为我们生成代码,这就是为什么一些开发者不考虑这个问题。没有这个,几乎不可能对类的equals(Object other)方法进行编码。

关于Java 9?

到目前为止,这篇文章中没有什么具体的Java 9,而这些日子,每个Java文章应该是关于Java 9(或已经有10个?)。

如果我们看看访问控制,一般我们要谈论JPMS,并且有很多伟大的文章。codeFx有一个很好的文章列表。斯蒂芬·科尔本也有很好的文章。

很快,您甚至可以从不同的发布商处购买有关Java模块系统的书籍。我处于一个幸运的位置,我已经可以从Packt的一个草稿中看过一个作为评论者,我喜欢它。但是JPMS在这个级别上并没有改变“私人”。仍然会有嵌套类和内部类和桥接方法 – 与以前完全相同。

有一点区别是,Java 9现在在接口内部有私有方法。这意味着现在我们应该准备使用合成桥接方法 – 不仅在内部和内部类中,而且在接口中。

带走

有时,最简单的事情并不像看起来那么简单。毕竟,所有的IT只不过是一堆0和1。只是我们有很多他们。真的很多 如果在本文中有新的内容,那么它应该告诉你,Java语言和JVM中有一些可能有兴趣更多地检查的领域。例如:

  • 嵌套和内部类之间有什么区别?

  • 你可以在类中有一个嵌套的接口,类似地,你可以在类内部有一个内部接口吗?

  • 界面内的类或接口怎么办?你可以在界面中有一个内部类吗?嵌套类怎么样?

  • 您可以使用列出所有类的方法的反射来编写代码吗?会列出合成方法吗?它会有什么修饰语?

  • 编译内部类时,它将具有编译的名称Outer $ Inner.class,这是一个合法的名称。但是如果有一个Outer $ Inner.java源文件会发生什么?想办法!

  • 生成的合成方法也有合法的名称。如果您使用该名称定义方法,会发生什么?Java规范或实现具体吗?

  • 内嵌和嵌套类和/或接口有多深?一个嵌套类可以包含一个内部类吗?内部类可以包含一个嵌套类吗?

  • 你为什么在JDK中没有合成修饰符的符号名称是什么猜测?为什么实际修饰符值与volatile字段的值相同?

  • 你可以在嵌套类中有静态字段,类或方法吗?

这些问题和知识的答案是不实际的,我知道。我从来没有看到任何代码或项目,知道一个内部类不能有一个静态字段是有任何优势。另一方面,考虑这些和得到答案可能会给你一些快乐,如解决填字游戏 – 如果这是你的口味。还有一些知识仍然可能有助于帮助我们以不认识的方式理解技术。在某些情况下,一个人比其他人更容易发现一个错误,因为他们“感觉”技术。那就是当你不能把耳朵里的解决方法告诉你耳朵 – 但是像上面这样的知识,就是这样。但是如果你喜欢挖掘这些技术,那只会让你耳语。

最后一个棘手的问题,甚至比以上更实际 – 只是为了娱乐,如果你喜欢:

难题

我们知道内部(非嵌套)类中不可能有静态字段。是否可以从内部类具有静态方法的Java编译器生成的编译类文件?

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,

需要突破技术瓶颈的可以加。2、在公司待久了,过得很安逸,

但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,

常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。

但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5. 群号:高级架构群478052716 备注好信息!

6.阿里Java高级大牛直播讲解知识点,分享知识,

多年工作经验的梳理和总结,带着大家全面、

科学地建立自己的技术体系和技术认知!

文章来源:智云一二三科技

文章标题:什么是Java 9中的私有?

文章地址:https://www.zhihuclub.com/176719.shtml

关于作者: 智云科技

热门文章

网站地图