java - 这些访问Java中其他类的方法有什么区别?

标签 java minecraft bukkit

目前我正在从事 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/

相关文章:

java - 线性布局嵌套

java - 构建失败并出现异常

java - 从 Java 运行 EXE

powershell - 如何在本地计算机上使用 PowerShell invoke-command 远程运行的 Minecraft 服务器中输入命令?

java - 从插件重新编译反编译的类

java - 物理圈碰撞弹出和滑动边界

java - 对我看到的教程有疑问

java - 引用价目表 - Bukkit 插件

java - Bukkit 阻止藤蔓生长

java.lang.ClassCastException; TreeSet<ItemStack> 没有堆栈跟踪