Java 类的客户机到底是什么

Java 类的客户机到底是什么,java,Java,我一直认为类的客户机是使用引用访问该类的实例字段/方法的客户机,即另一个类(从它自己的方法)。但是当我想到一些细节时,有些事情我想不出来 在Java中,我知道有几个地方可以放置操作语句 方法内部(实例/静态) 内联初始化(在中声明实例变量时) 私有整数x=5;) 静态块 也许还有更多我不知道或不记得的 问题的第一部分是如果这些客户属于其他类别,那么他们是否都被视为客户?当他们在同一个班级时,他们也可以访问私人资料吗 第二部分是:当JVM调用一个方法(比如main和finalize)时,它们也

我一直认为类的客户机是使用引用访问该类的实例字段/方法的客户机,即另一个类(从它自己的方法)。但是当我想到一些细节时,有些事情我想不出来

在Java中,我知道有几个地方可以放置操作语句

  • 方法内部(实例/静态)
  • 内联初始化(在中声明实例变量时) 私有整数x=5;)
  • 静态块
也许还有更多我不知道或不记得的

问题的第一部分是如果这些客户属于其他类别,那么他们是否都被视为客户?当他们在同一个班级时,他们也可以访问私人资料吗

第二部分是:当JVM调用一个方法(比如main和finalize)时,它们也被认为是客户机吗?(呼叫不是来自某个类?)


编辑:客户端能否仅访问公共方法和变量?如果它访问包字段(如果在同一个包中),我们不能称它为客户机吗?

在深入研究Java之前,让我们尝试将情况映射到物理世界场景

你去糕点店点了一份糕点。你从商店拿到糕点,付了钱就走。你自然地称自己为商店的客户。那么我们从中了解到了什么

术语客户机指从另一个实体请求服务的任何实体。客户不关心提供服务的实体如何实际提供服务——只要服务可用并满足其用例,客户就会感到高兴

因此,当类中的方法M1调用另一个方法M2时,M1就是M2的客户机。类似地,当类C1请求C2的服务时,C1是C2的客户机

<> P> >关于“强>主”(<)/强>、“强>终结”(<)>强> >与JVM的交互——您可以将JVM的类加载器视为类的客户端,因为它加载JVM类加载器将加载类,然后<强>请求< /强>主方法开始执行并继续进一步处理。
基于OP-
finalize()
方法的注释进行编辑,JVM中的垃圾收集器使用一些内部JVM技巧来访问该方法。作为一般规则,任何正常应用程序都不会执行此类欺骗。

一个类的客户机,在这个术语的普遍接受的用法中,是使用引用访问方法的任何其他类(由于OOP中的封装原理,不太可能是字段)。您列举的内容在任何方面都不被视为客户。但是这个术语是一种通用编程语言的一部分,它的背后并没有一个大的理论。这正是大多数程序员所理解的。

我不相信“类客户机”有严格的定义。我通常说“客户机代码”,即通过某种合同使用另一段代码的一段代码。从这个角度来看,当调用类的finalize方法时,甚至JVM也可以被视为类代码的客户机代码,因为它通过在
对象
类(其
finalize
方法)中定义的特定接口与类一起工作

无论如何,这里的重点不是你如何称呼它,而是你如何看待它。调用类的客户机JVM对您来说意味着什么,还是会影响您编写代码的方式?我想不是。所以我更喜欢谈论两段代码之间的契约(接口)的概念

。。。类的客户端是使用引用访问。。。该类的字段/方法

正确但不限于实例

。。。如果这些客户属于另一类,那么他们是否都被视为客户

是的,如果方法和变量引用它,它们就是其他类的客户机

请注意,内联初始化实际上是构造函数方法中初始化的缩写,静态块用于静态初始值设定项

[客户端]可以[从其他类]访问私人内容吗

只有在其他类允许的情况下(比如从getter方法返回私有对象)。受保护的东西也一样,除非它在同一个包中,否则JVM本身不受私有/受保护限制

当JVM调用一个方法(比如main和finalize)时,它们也被认为是客户机吗?(呼叫不是来自某个类?)

在这种情况下,JVM或其组件之一被视为客户机。
调用可能来自JVM中的类,具体取决于JVM实现。

我不确定Java中是否有“客户机”的严格定义。事实上,我更倾向于将这个术语仅用于接口,因为它们强制封装并避免静态调用。由于有不同的可访问性模式应用于方法和字段,因此很难预测和定义哪个调用是“客户端”,哪个不是。此外,另一个问题出现了:“我们是否应该将子类称为“客户机”类,因为它可能使用父类的方法?”

编辑了我的问题。如果是客户机,JVM如何访问受保护的方法(finalize)?请阅读此SO线程-因此,我们可以说客户机通常只直接访问公共方法和变量(除非它像JVM一样被特殊处理)。这是否包括静态方法和变量?客户端是否只能访问公共字段/方法?如果JVM被认为是客户端,那么JVM访问受保护的方法如何最终确定?@InsignificantPerson我更新了答案以反映您的评论。如果JVM不受私有/受保护限制,为什么main需要是公共的?@In因为main是由运行JVM的客户端调用的,它不完全是供内部使用的,因此可以由人和用户调用