2017-12-17 9 views
-2

私は、Javaに新しいですし、私はコードの一部を理解しようとしています:clone.setPixel(getPixel(i, j), i, j);は正確に別のメソッドの中で別のメソッドを呼び出す?

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; 
} 

何をしますか?そして、ほとんど私が理解していないのは、setPixel(getPixel(i, j), i, j);の前にあるclone.は何ですか?

答えて

0

このメソッドは、メソッドが呼び出されるオブジェクトのコピーを作成します。 最初の「クローン」はメソッドの名前で、2番目の(これも3番目の)クローンは返されるImageのインスタンスです。

clone.setPixel(getPixel(i, j), i, j); 

このメソッドは、現在のオブジェクトと同等の特性を使用して(Imageある)結果オブジェクトの画素を設定しています。

clone.は、setPixel(getPixel(i, j), i, j);の前には何をしているのですか?

上記のとおり、これはメソッドの元のインスタンス名です。 getPixel(i, j)は現在のオブジェクトを呼び出すため、this.getPixel(i, j)に相当します。

+0

しかし、 'setPixel'は' Image'クラスのものです。私はまだ 'クローン'がやっていることを理解していない...言い換えれば私にそれを説明できますか? –

+0

@ JamesH 'clone'は' Image'のインスタンスで、そのインスタンスで 'setPixel'を呼びたいとします。 – Parsa

0

まず、クラス、インスタンス、およびメソッドの違いを理解する必要があります。第二に私はインスタンスとメソッドの名前を同じ名前のcloneにすることは悪い習慣だと思います。この例では

使用すると、1つのクラスImage、もしオペレータnewを使用して新しいオブジェクトを作成するとき、あなたは、特定の座標で一つの画素の値を取得するために使用される方法public float getPixel(int height, int width)を有する暗黙的に使用される1つのコンストラクタprivate Image(String magicNumber, int height, int width, float max)を有する(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; 
} 

なるようにリファクタリングされるべき別の方法ボイドsetPixel(float value, int height, int width)は私は実際には、imageInstanceことがImageインスタンスの名前を変更しましたこの会合HODはそれだけで現在のオブジェクト内のすべてのピクセルの上にImage、ループの新しいオブジェクトを作成し、今ラインimageInstance.setPixel(getPixel(i, j), i, j); /** trying to understand this line */は、それは2つの方法がsetPixelを呼び出す含まれていimageInstance

の同じ場所にそのピクセルをコピーされ、非常にシンプルで簡単ですgetPixel実行される最初のものは内側のものgetPixel現在のピクセルの値を取得する外部メソッドはメソッドからの値を使用してi, jのピクセル値を設定するsetPixelと呼ばれますimageInstance

最終結果はb現在の正確なコピーImageインスタンス

+0

ありがとうございます。これは、 'imageInstance.setPixel(getPixel(i、j)、i、j)'を実行すると、すべてのLoopを意味しますか? 'imageInstance'は更新されますか? –

+0

@JamesH、はい、繰り返しごとにimageInstanceが更新されます –

+0

OK。最後の2つの質問:1)Imageを返し、 'Image filtered = image.clone();'を実行する別のクラスのメソッドがあります。この行は正確に何をしますか?そして、2)私は、クラス「Image」からすべてのメソッドにアクセスしたいです。 'Image' = new Image(getMagicNumber()、getHeight()、getWidth()、getMax());でこれを行うことができますか?これは' Image'のすべてのメソッドにアクセスする権利を与えますか? –

関連する問題