2017-12-17 9 views
-2

내가 자바에 새로운 오전과 나는 코드의 조각을 이해하려고 노력하고 있어요 :다른 메서드 내에서 다른 메서드를 호출합니까?

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); 정확히 무엇을 하는가를? 그리고 대부분 이해가 안되는 부분은 setPixel(getPixel(i, j), i, j); 전의 clone.입니다.

답변

0

이 메서드는 메서드가 호출되는 개체의 복사본을 만듭니다. 첫 번째 "복제본"은 메서드의 이름이고 두 번째 (세 번째도 있음)는 반환되어야하는 Image의 인스턴스입니다.

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

이 방법은 현재 오브젝트와 동등한 특성을 사용하여 (AN Image이다) 결과 개체의 화소를 설정한다.

그리고 내가 대부분 이해하지 못하는 것은 무엇입니까 clone. 전에 setPixel(getPixel(i, j), i, j); 무엇입니까?

위에서 말했듯이, setPixel의 발신자는 인스턴스 이름입니다. getPixel(i, j)은 현재 객체를 호출하므로 this.getPixel(i, j)과 같습니다.

+0

하지만'setPixel'은 클래스'Image'에서 왔습니다. 나는 아직도'.clone'이하고있는 것을 이해하지 못한다 ... 다른 말로 설명해 주시겠습니까? –

+0

@JamesH'clone'은'Image'의 기본 요소이며, 그 인스턴스에서'setPixel'을 호출하려고합니다. – Parsa

0

먼저 클래스, 인스턴스 및 메소드의 차이점을 이해해야합니다. 둘째로 나는 인스턴스와 메서드를 같은 이름의 clone으로 명명하는 것은 나쁜 습관이라고 생각한다. 당신은이 예에서

는 오퍼레이터 new을 사용하여 새로운 객체를 생성 할 때 내재적으로 사용되는 하나의 생성자 private Image(String magicNumber, int height, int width, float max)은 또한 특정 좌표 (int height, int width)을 하나 개의 화소의 값을 검색하는 데 사용되는 방법 public float getPixel(int height, int width)이 클래스 Image 번 특정 좌표의 화소 값을 설정하는 데 사용되는 다른 방법 공극 setPixel(float value, int height, int width)는 그것이 리팩토링한다 public Image clone() 마지막 방법은 그냥 사실 imageInstance이어야 할 Image 인스턴스의 이름을 변경

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

될 이 만난 사람 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

감사합니다. 모든 'Loop'에 대해 'imageInstance.setPixel (getPixel (i, j), i, j)'를 실행하면'imageInstance'가 업데이트됩니다. –

+0

@JamesH, 예 반복 할 때마다 imageInstance가 –

+0

으로 업데이트됩니다. 마지막 두 가지 질문 : 1) 이미지를 반환하고 Image filtered = image.clone();을 수행하는 다른 클래스의 메서드가 있습니다. 이 행은 정확히 무엇을합니다. 그리고 2)'Image' 클래스에서 모든 메서드를 처리하고 싶습니다. 'Image name = new Image (getMagicNumber(), getHeight(), getWidth(), getMax()); '로이 작업을 수행 할 수 있습니까? 그러면'Image'의 모든 메소드에 접근 할 수있는 권한이 생깁니 까? –