【问题标题】:How to create a correct instance in Java?如何在 Java 中创建正确的实例?
【发布时间】:2018-06-02 16:20:38
【问题描述】:

我正在学习Java,发现this 关于 stackoverflow 的文章。

所以有两个类:

public class Image {

...

    public Image clone() {
        Image clone = new Image(getMagicNumber(), getHeight(), getWidth(), getMax());
        for (int i = 0; i < getHeight(); i++){

            for (int j = 0; j < getWidth(); j++){
                clone.setPixel(getPixel(i, j), i, j);
             }
        }
        return clone;
    }
}

还有这个类:

public class Filter {

    public Filter() {

    }

    public Image linearFilter(Image image, float[][] kernel) {
        Image filtered = image.clone();

        ...

         return filtered;
    }
}

我习惯使用X instancename = new X(); 来创建一个实例,其中X 是类的名称。创建实例有不同的方法吗?例如在Filter 类中:Image filtered = image.clone(); 如何创建实例?为了创建一个实例,我认为“方程”的两边 X 必须相等。我的意思是:Image filtered = new Image();。我不明白Image filtered = image.clone(); 是如何创建一个新实例的。谁能解释一下?

【问题讨论】:

  • 在 clone 方法中,你没看到 = new ... 吗?完全一样
  • 如果您有Image 的源代码,您会看到Image#clone 或其调用方法之一将调用new Image(...)。克隆图像只是隐藏了创建新图像所需的逻辑,同时保留了克隆语义。
  • 无论你在哪里了解到双方需要“平等”都是错误的。比如stackoverflow.com/questions/17459553/…更准确地说,两边一定是相关的,左边是高阶对象
  • 这是否意味着如果你有类 A 和 B 并且在 A 中有一个名为 clone 的方法创建一个实例 A name = new A(); 你可以通过执行 Type newname = variable.clone() 在 B 中创建一个实例?

标签: java methods constructor instance


【解决方案1】:
Image filtered = image.clone();

一样
Image filtered = new Image();

你可以看到clone()是你的类的一个方法,它返回Image类的instance

但是当你想只创建一个类的实例时,使用像clone()这样的方法创建实例是支持的,你可以创建你的类的实例public and final,然后使用公共方法返回它。

【讨论】:

    【解决方案2】:

    类:图像如何过滤 = image.clone();创建一个实例?

    它正在创建一个实例,您可以看到方法clone() 正在返回类型Image,该方法的第一行显示如下:

    Image clone = new Image(getMagicNumber(), getHeight(), getWidth(), getMax());

    最后这个方法clone被返回了,这就是逻辑

    希望对你有帮助

    【讨论】:

    • 这是否意味着如果你有类 A 和 B 并且在 A 中有一个名为 clone 的方法,它创建一个实例 A name = new A();您可以通过执行 Type newname = variable.clone() 在 B 中创建一个实例?
    • 是的,但前提是该方法克隆返回 A 类型的实例
    • 根据您在 cmets 中的问题,clone() 应该返回 name,它是 A 类的一个实例
    • 免得说我们在 Image 类中没有 clone 方法。但我也想做同样的事情。我应该首先通过执行“图像过滤=新图像()”在类过滤器中创建一个实例吗?这会一样吗?
    • 是的,它会是一样的,因为最后你在这两种情况下都返回了类 Image 的实例
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多