目前我正在从事 Java 开发,并且我正在努力理解实例的概念和那种性质的事物。当我有一个变量或方法需要在另一个类中访问时,目前我会这样做
public class Class1 implements Listener {
private final Main main;
private final Class2 class2;
public Class1(Main main, Class2 class2) {
this.main= main;
this.class2 = class2;
}
我应该提一下,我正在尝试开发一个 minecraft 插件,因此 Listener 类必须实现 Listener。但是,当我尝试为需要引用 2 个类的类注册事件(同样,Minecraft 的另一件事)时,代码变得困惑。例如,一个类要获取一个引用其他 2 个类的类,eventRegister 可以如下所示:(在主类中)
pm.registerEvents(new ClassX(this, new ClassY(this, new ClassZ(this))), this);
(注册事件需要一个监听器和一个主类)
我的问题是:这种获取另一个类的方法与简单地扩展它之间有什么区别。有区别吗?
最佳答案
当您将一个实例传递给另一个实例时(在您的情况下通过构造函数),您正在应用 object composition ,这类似于说“我将把这个特定的引擎放入这辆特定的汽车中”。您可能想将不同的引擎放入不同的汽车中,因此您将传递不同的引擎作为构造函数。
实现
称为 inheritance .继承背后的理念是知道所有类都是同类。例如,您可能会说“所有汽车都可以 turnLeft() 和 turnRight()”,因此如果有人想创建自己的汽车(或者在您的情况下是他们自己的插件),他们的汽车也需要能够 turnRight()
和 turnLeft()
。
让我们回到您的问题。如果您看到一段看起来“通用”的代码,您可能希望将通用部分提取到它自己的类中,然后继承该类。例如“所有动物都可以shout()
”或“所有工具都可以use()
-d”。但是,如果您想让这只鸭子知道那只鸭子 - 您需要在另一只鸭子中引用一只鸭子。
但是,这并不意味着您需要使用构造函数。构造函数用于对象不能没有的引用(不能处于有效状态)。例如 new Duck(new DuckBrain())
是有道理的,但是 new Duck(new Duck())
没有意义。对于这些情况,您可以引入 setters (在链接中搜索 Java 示例)。 setter 是更改对象包含内容的方法。
关于java - 这些访问Java中其他类的方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50710660/