首页 > 解决方案 > 这些访问Java中其他类的方法有什么区别?

问题描述

目前我正在进入 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);

(注册事件需要一个监听器和一个主类)

我的问题是:这种获取另一个类的方法和简单地扩展它有什么区别。它有区别吗?

标签: javaminecraftbukkit

解决方案


当您将一个实例传递给另一个实例时(在您的情况下通过构造函数),您正在应用对象组合,这类似于说“我将把这个特定的引擎放入这辆特定的汽车”。您可能希望将不同的引擎放入不同的汽车中,因此您将传递不同的引擎作为构造函数。

implements称为继承。_ 继承背后的想法是知道所有的类都是同一种。例如,您可能会说“所有汽车都可以 turnLeft() 和 turnRight()”,因此如果有人想创建自己的汽车(或者在您的情况下 - 他们自己的插件),他们的汽车也需要能够turnRight()turnLeft().

让我们回到你的问题。如果您看到一段看起来“通用”的代码,您可能希望将通用部分提取到它自己的类中,然后继承该类。例如“所有动物都可以shout()”或“所有工具都可以use()-d”。但是,如果您想让这只鸭子知道那只鸭子 - 您需要在另一只鸭子中引用一只鸭子。

但是,这并不意味着您需要使用构造函数。构造函数用于对象不能没有的引用(不能处于有效状态)。例如new Duck(new DuckBrain())有意义,但new Duck(new Duck())没有意义。对于这些情况,您可能会引入setter(在链接中搜索 Java 示例)。Setter 是改变对象包含的内容的方法。


推荐阅读