我是Java新手,我正在尝试理解一段代码:
public class Image {
...
public float getPixel(int height, int width) {
return data[height][width];
}
public void setPixel(float value, int height, int width) {
if (value > getMax())
value = getMax();
if (value < 0)
value = 0;
data[height][width] = value;
}
private Image(String magicNumber, int height, int width, float max) {
this.magicNumber = magicNumber;
this.width = width;
this.height = height;
this.max = max;
data = new float[height][width];
}
...
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); /** trying to understand this line */
}
}
return clone;
}
clone.setPixel(getPixel(i, j), i, j);
究竟做了什么?而我最不理解的是clone.
之前setPixel(getPixel(i, j), i, j);
正在做什么?
答案 0 :(得分:0)
此方法正在创建调用该方法的对象的副本。
第一个“clone”是方法的名称,第二个(也是第三个)是应该返回的Image
的实例。
clone.setPixel(getPixel(i, j), i, j);
此方法使用当前对象等效属性设置结果对象的像素(即Image
)。
而我最不理解的是
clone.
之前的setPixel(getPixel(i, j), i, j);
是做什么的?
正如我上面所说,它只是方法setPixel
所来自的实例名称。
getPixel(i, j)
正在调用当前对象,因此它等同于this.getPixel(i, j)
。
答案 1 :(得分:0)
首先,您应该了解Class,Instance和Method之间的区别。其次,我认为命名一个具有相同名称clone
的实例和方法是一种不好的做法。
在此示例中,您有一个类Image
,一个构造函数private Image(String magicNumber, int height, int width, float max)
在使用运算符new
创建新对象时隐式使用,您还有方法{{1} }用于检索某个坐标public float getPixel(int height, int width)
处的一个像素的值,另一个方法void (int height, int width)
用于设置某个坐标处的像素值,最后一个方法setPixel(float value, int height, int width)
它应该重构为
public Image clone()
我刚刚将public Image clone() {
Image imageInstance = new Image(getMagicNumber(), getHeight(), getWidth(), getMax());
for (int i = 0; i < getHeight(); i++) {
for (int j = 0; j < getWidth(); j++) {
imageInstance.setPixel(getPixel(i, j), i, j); /** trying to understand this line */
}
}
return imageInstance;
}
实例的名称更改为Image
,实际上这个方法非常简单明了,只需创建imageInstance
的新对象然后遍历所有当前对象中的像素,并将该像素复制到Image
现在行imageInstance
包含2个方法调用imageInstance.setPixel(getPixel(i, j), i, j); /** trying to understand this line */
和setPixel
第一个要执行的方法是内部getPixel
它将检索当前值像素,外部方法将被称为getPixel
,它将使用setPixel
方法中的值来设置getPixel
的坐标i, j
处的像素值
最终结果将是当前imageInstance
实例