我一直认为类的客户端是一个使用引用来访问该类的实例字段/方法的客户端,即另一个类(来自它自己的方法)。但是当我想到一些细节时,有一些我无法弄清楚的事情。
在Java中,我知道可以放置动作声明的几个地方。
也许还有更多我不知道或不记得。
问题的第一部分是,如果他们在另一个班级中,所有这些都被视为客户?当他们在同一个班级时,他们也可以访问私人物品吗?
第二部分是:当JVM调用方法(如main和finalize)时,它们也被视为客户端吗? (这些电话不是来自一个班级?)
编辑:客户端是否只能访问公共方法和变量?如果它访问包字段(如果在同一个包中),我们不能称之为客户端。
答案 0 :(得分:27)
在深入研究Java -lets之前,尝试将情况映射到物理世界场景。
你去糕点店订购糕点。你从商店买到糕点,然后离开。您自然地称自己为商店的客户。那么我们从中得到了什么呢?
术语客户端是指从另一个实体请求服务的任何实体。客户端并不关心提供服务的实体如何实际提供服务 - 只要服务可用并满足其使用案例,客户就会感到满意。
因此,当一个类中的方法 M1 调用另一种方法 M2 时, M1 是 M2 的客户>。同样,当 C1 类要求 C2 服务时,C1就是C2的客户端。
关于 main(), finalize()以及与JVM的交互的问题 - 您可以将JVM的类加载器视为您的客户端class,因为它加载JVM类加载器将加载你的类,然后请求主方法开始执行并继续进一步处理。
基于来自OP - finalize()
方法的注释的编辑由JVM中的垃圾收集器使用一些内部JVM技巧进行访问。作为任何正常应用程序中的一般规则,将不会执行此类技巧。
答案 1 :(得分:4)
我不相信存在对“班级客户”的严格定义。我通常说“客户端代码”,即通过某种契约使用另一段代码的一段代码。从这个角度来看,甚至JVM在调用您的类“finalize
方法时,也可以被视为您的类代码的客户端代码,因为它可以通过Object
中定义的特定接口与您的类一起使用class(finalize
方法)。
无论如何,这里的重点不是你如何称呼它,而是你对它的看法。调用JVM你的类的客户端对你来说意味着什么,或者影响你编写代码的方式?我想不是。所以我更喜欢谈论两段代码之间的契约(接口)概念。
答案 2 :(得分:4)
...类的客户端是使用引用来访问该类的字段/方法
的客户端
正确但不限于实例
...如果他们在另一个班级中,所有这些都被认为是客户吗?
是的方法和变量是其他类的客户端,如果它们引用它。
请注意,内联初始化实际上是构造函数方法中初始化的简写,以及静态初始化程序的静态块。
可以[客户]访问私人资料[来自其他一些职业]吗?
仅当其他类允许时(例如从getter方法返回私有对象)。对于受保护的东西,除非它在同一个包中,否则JVM本身不受私有/受保护限制。
当JVM调用方法(如main和finalize)时,它们也被认为是客户端吗? (这些电话不是来自一个班级?)
在这种情况下,JVM或其中一个组件被视为客户端。 调用可能来自JVM中的一个类,具体取决于JVM的实现。
答案 3 :(得分:2)
类的客户端,在该术语的普遍接受的使用中,是使用引用访问方法的任何其他类(由于OOP中的封装原理而不太可能的字段)。您列举的内容不以任何方式被视为客户。但这个术语是一种常见的编程语言的一部分,它并不像它背后有一个很大的理论。这正是大多数程序员所理解的。
答案 4 :(得分:0)
我不确定,对客户'有严格的定义。在Java中。实际上,我宁愿仅针对接口建议这个术语,因为它们强制执行封装并避免静态调用。由于存在适用于方法和领域的不同可访问性模式,因此难以预测和定义哪个确切的呼叫是“客户端”。哪个不是。此外,另一个问题出现了:'我们应该将儿童班称为“客户”"一,因为它可能使用父方法?'