Java 9中什么是私有的?

在进行面试时,我发现大多数应聘者都不知道Java中的private修饰符真正意味着什么。 他们知道一些足以进行日常编码的事情,但还远远不够。 这不成问题。 足够了解就足够了。 但是,了解Java的一些内部工作仍然很有趣。 在极少数情况下,它可能会揭示某些细节。 如果没有别的,那就很有趣.orElse(whyDoYouReadIt)

顺便说一句:在我看来,即使与我个人有关的陈述和含义是虚假的,提及面谈也是写评委的好机会。 毕竟,我这个人并不重要,并且远离批评我的事实,我发现这篇文章很有趣,关于访谈的结论很重要,实际上完全符合我的观点。

本文希望以比阅读语言标准更具可读性的方式描述一些Java事实。

那么什么是私人的?

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

封闭类内部的私有方法可以从外部类调用吗? 封闭类中的代码可以在外部类中调用私有方法吗? 在两种情况下答案都是肯定的。 样例代码

package javax0.package1;class TopLevelClass {void topMethod(){NestedClass nc = new NestedClass();nc.method();}private int z;interface NestedInterface {default void method(){TopLevelClass tlc = new TopLevelClass();tlc.z++;}}static class NestedClass {private int k;private void method() {TopLevelClass tlc = new TopLevelClass();k = tlc.z;}}
}

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

如果我们编译此单个源文件,则会得到三个类文件:

  1. TopLevelClass$NestedClass.class
  2. TopLevelClass$NestedInterface.class
  3. TopLevelClass.class

那是因为JVM不知道什么是顶层和嵌套的。 JVM对嵌套类和顶级类一无所知。 对于JVM,类只是一个类。 如果您坚持的话,要参加顶级课程。 这主要是因为Java语言1.0没有嵌套类和内部类,并且JVM是根据该类设计的。 在Java 1.1中引入内部类和嵌套类时,仅修改了编译而不是JVM,因此内部类和嵌套类仍然是语言功能,但不能直接由JVM处理。

顶级类如何访问嵌套在源代码中的另一个类中的私有方法,但是在编译时,它只是另一个“顶级”类。 它们处于同一级别。 如果将可访问性更改为公共,那么我们也可以从其他类中访问它,但我们不能。 编译器将不允许其他类中的任何其他代码访问私有方法,即使我们做了一些技巧来克服编译器,生成的类填充也将使JVM引发异常。 Java中的私有是私有的。

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

将为从同一顶级类内部的不同类访问的每个私有字段或方法创建一个桥接方法。 如果未从封闭类访问私有对象,则不会生成该方法。 如果仅读取该字段,则仅生成getter;如果仅从外部进行设置,则仅生成setter。

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

Java 9呢?

到目前为止,本文中没有关于Java 9的特定内容,而如今,每一篇Java文章都应该涉及Java 9(或已经是10)了。

如果我们一般地看一下访问控制,那么我们就不得不谈论JPMS,并且有很多关于此的文章。 codeFx上有很好的文章清单。 Stephen Colebourne的文章不错。

很快,您甚至可以从不同的出版商那里购买有关Java模块系统的书籍。 我很幸运,我已经可以阅读Packt的草稿,成为审稿人,我很喜欢。 但是,JPMS不会在此级别上更改“私有”。 仍然会有嵌套类,内部类和桥接方法,它们与以前完全相同。

几乎没有什么不同,Java 9现在在接口内部具有私有方法。 这意味着现在我们应该准备在内部和嵌套类中以及在接口中都具有合成桥方法。

起飞...

有时候最简单的事情并不像看起来那样简单。 毕竟,整个IT技术,科学和工程都不过是一堆零和一。 只是我们有很多。 真的很多 如果本文对您来说是新的内容,那么它应该告诉您Java语言和JVM中的某些领域您可能有兴趣研究更多。 例如:

  • 嵌套类和内部类之间有什么区别?
  • 您可以在类内部有一个嵌套接口,而在类内部也可以有一个内部接口?
  • 接口中的类或接口呢? 接口中可以有内部类吗? 嵌套类怎么样?
  • 您可以使用反射来编写列出类所有方法的代码吗? 会列出合成方法吗? 它会具有哪些修饰符?
  • 编译内部类时,它将具有已编译名称Outer$Inner.class ,这是一个合法名称。 但是,如果有Outer$Inner.java源文件会发生什么? 想办法!
  • 生成的合成方法也具有合法名称。 如果使用该名称定义方法会怎样? 您看到的是Java规范还是特定于实现的?
  • 您可以嵌套内部和嵌套的类和/或接口有多深? 嵌套类可以包含内部类吗? 内部类可以包含嵌套类吗?
  • 您怎么猜,为什么JDK中没有合成修饰符的符号名? 为什么修改器的实际值与volatile字段的值相同?
  • 嵌套类中可以有一个静态字段,类或方法吗?

我知道,这些问题和知识的答案不切实际。 我从未见过任何代码或项目,这些代码或项目知道内部类不能具有静态字段会带来任何好处。 另一方面,考虑这些问题,获得答案可能会给您带来一些快乐,例如解决填字游戏(如果您喜欢的话)以及仍然有用的知识,以我们无法识别的方式帮助理解技术。 在某些情况下,一个人发现错误的速度比其他人快,因为她“感觉”到该技术。 那是当您无法说出是什么在耳边窃窃私语时,却是像上面那样的知识。 但是,只有当您喜欢深入研究该技术的那些细微之处时,才会如此。

最后一个技巧性的问题,如果您愿意,甚至比上面的娱乐问题还不如上面的实用:

难题

我们知道,内部(非嵌套)类内部不可能有静态字段。 仍然有可能由Java编译器从具有静态方法的内部类生成编译的类文件吗?

翻译自: https://www.javacodegeeks.com/2017/08/private-java-9.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python国际象棋ai程序_用Python编写一个国际象棋AI程序

最近我用Python做了一个国际象棋程序并把代码发布在Github上了。这个代码不到1000行,大概20%用来实现AI。在这篇文章中我会介绍这个AI如何工作,每一个部分做什么,它为什么能那样工作起来。你可以直接通读本文,或者去下载代码&…

java switch case怎么判断范围_【转】Java期末复习攻略!

期末19年就这样要过去了,终于到了小时候作文里的未来呢!然而,期末考试也随之来临了。不知大家“预习”的怎么样呢? 期末复习资料的放送快接近尾声了下面康康学长学姐们怎么教你们打java这个boss(下面是java大佬给大家的复习建议以…

java list 去重复元素_java List去掉重复元素的几种方式

使用LinkedHashSet删除arraylist中的重复数据(有序)List words Arrays.asList("a","b","b","c","c","d");HashSet setnew LinkedHashSet<>(words);for(String word:set){System.out.println(word);}使用Has…

spring aop示例_Spring JpaRepository示例(内存中)

spring aop示例这篇文章描述了一个使用内存中HSQL数据库的简单Spring JpaRepository示例。 该代码示例可从GitHub的Spring-JpaRepository目录中获得。 它基于带有注释的Spring-MVC-示例和此处提供的信息 。 JPA资料库 在此示例中&#xff0c;我们实现了一个虚拟bean&#xff1…

python人工智能入门优达视频_机器学习:优达教你搭建Python 环境的正确姿势

原标题&#xff1a;机器学习:优达教你搭建Python 环境的正确姿势为机器学习搭建好 Python 环境听起来简单&#xff0c;但有时候坑还不少。如果此前没有配置过类似的环境&#xff0c;很可能会苦苦折腾各种命令好几个小时。可是我明明只是想马上搞起来我的机器学习&#xff01; 在…

java web登录状态保持_java web用于保持状态的4种方法

方法一&#xff1a;网址重写通过在url地址后面添加若干的token作为查询字符串来实现。token的值一般为 键值url?key1value1&key2value2&...&keynvaluenurl与token之间需要用?分开&#xff0c;两个token之间则是需要用一个&符号隔开。此方法适用于token不需要…

python天天向上续2_2019/2/12 Python今日收获

Python day12——025&#xff0c;026字典&#xff1a;当索引不好用时 1.字典&#xff1a;python唯一的一个映射类型。用键值对存储数据&#xff0c;他的标志是大括号。一个键值组合叫一个项。键的类型既可以是字符串类型也可以是整形也可以是浮点型。 如&#xff1a;dict{1:one…

python生成矩阵_如何在Python中生成矩阵?

你的问题的答案取决于你的学习目标是什么。如果您试图让矩阵“点击”以便以后使用它们&#xff0c;我建议您查看一个Numpyarray&#xff0c;而不是一个列表列表。这将使您可以轻松地分割行、列和子集。只要试着从列表中获取一个列&#xff0c;你就会感到沮丧。 使用列表列表作为…

java ee cdi_Java EE CDI ConversationScoped示例

java ee cdi在本教程中&#xff0c;我们将向您展示如何在Web应用程序中创建和使用ConversationScoped Bean。 在CDI中&#xff0c;bean是定义应用程序状态和/或逻辑的上下文对象的源。 如果容器可以根据CDI规范中定义的生命周期上下文模型来管理其实例的生命周期&#xff0c;则…

js input 自动换行_深入Slate.js - 拯救 ContentEditble

我们是钉钉的文档协同团队&#xff0c;我们在做一些很有意义的事情&#xff0c;其中之一就是自研的文字编辑器。为了把自研文字编辑器做好&#xff0c;我们调研了开源社区各种优秀编辑器&#xff0c;Slate.js 是其中之一&#xff08;实际上&#xff0c;自研文字编辑器前&#x…

java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...

最近看golang main函数结束&#xff0c;所有协程都被结束了结论是这样&#xff1a;A不是main程的情况下&#xff0c;在A程里开启B程&#xff0c;A程执行完&#xff0c;A程return之后&#xff0c;B程不受影响&#xff0c;不会挂掉。所有子协程与main程同级的&#xff0c;与main程…

安全点

安全点 Java应用程序中有两个逻辑线程组&#xff1a; 应用程序线程执行应用程序逻辑 执行GC的线程 在执行诸如堆压缩之类的操作时&#xff0c;GC线程会四处移动一些对象&#xff0c;并且这些对象不能被任何应用程序线程使用&#xff0c;因为它们的物理位置可能会发生变化。 …

printf 地址_C程序显示主机名和IP地址

查找本地计算机的主机名和IP地址的方法有很多。这是使用C程序查找主机名和IP地址的简单方法。我们将使用以下功能&#xff1a;gethostname() &#xff1a;gethostname函数检索本地计算机的标准主机名。gethostbyname() &#xff1a;gethostbyname函数从主机数据库中检索与主机名…

java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值当基本数据类型作为普通变量(八大基本类型&#xff1a; byte,char,boolean,short,int,long,float,double)只有开发人员对其进行初始化&#xff0c;java不会对其进行初始化&#xff0c;如果不初始…

python开发的系统有哪些_Python web开发=几个模板系统的性能对比

Python web 开发&#xff1a;几个模板系统的性能对比 对比目标&#xff0c; jinja2 &#xff0c; cheetah &#xff0c; mako &#xff0c; webpy &#xff0c; bottle &#xff0c; tornado &#xff0c; django 的性能。 方法&#xff0c; 随机生成一个二维数组&#xff0c; …

java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法

在本文中&#xff0c;我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法。StringBuilder(str).reverse()char[]循环与值交换byte循环与值交换apache-commons-lang3如果是为了进行开发&#xff0c;请选择StringBuilder(str).reverse()API。出于学习的目的&…

xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法

xstream xml模板有时候&#xff0c;我们不得不处理XML数据。 而且大多数时候&#xff0c;这不是我们一生中最快乐的一天。 甚至有一个术语“ XML地狱”描述了程序员必须处理许多难以理解的XML配置文件时的情况。 但是&#xff0c;不管喜欢与否&#xff0c;有时我们别无选择&…

python知识点智能问答_基于知识图谱的智能问答机器人

研究背景及意义 智能问答是计算机与人类以自然语言的形式进行交流的一种方式&#xff0c;是人工智能研究的一个分支。 知识图谱本质上是一种语义网络&#xff0c;其结点代表实体&#xff08;entity&#xff09;或者概念&#xff08;concept&#xff09;&#xff0c;边代表实体/…

java会了还学什么_java都学哪些内容?学完之后可以做哪些工作?

展开全部阶段一&#xff1a;揭开企业开发神秘面纱 (4周32313133353236313431303231363533e78988e69d8331333431336163)1) Web开发基础&#xff1a;HTML语言、JavaScript、CSS、DOM等2) Oracle数据库基础&#xff1a;安装、配置Oracle数据库&#xff0c;熟练掌握SQL语句3) 操作系…

Java中的RAII

资源获取即初始化&#xff08; RAII &#xff09;是Bjarne Stroustrup用C 引入的一种用于异常安全资源管理的设计思想。 感谢垃圾回收&#xff0c;Java 没有此功能&#xff0c;但是我们可以使用try-with-resources实现类似的功能。 约翰哈德斯&#xff08;John Huddles&#x…