2014-03-19 2 views
0

자바 언어에 대해 아직 비교적 새로운 언어이기 때문에 꽤 오랜 시간이 걸릴 것입니다.왜 개체 값이 아닌 초기 값이 변경됩니까?

이 프로그램에는 Point라는 클래스가 있습니다. 이렇게하면 모양의 정점에 대한 점이 만들어집니다.

이 클래스
public class Point { 

     private int x; 
     private int y; 

    public Point(int x, int y){ 

     this.x = x; 
     this.y = y; 

    } 

때문에 이러한 거리 등의 방법 (2 점 간의) 배율 (배 증가) (는 x를 취하고 y 좌표 및 this.x에 추가하고 XY) 변환하고있다 에.

그런 다음 3 개의 클래스를 추가하여 도형을 만듭니다. 삼각형, 직사각형, 원으로 구성되며, 생성자는 이와 같이 보입니다.

public class Triangle { 

     private int sides; 
     private Point[] points; 

    public Triangle(Point[] vertices) { 

     this.sides = 3; 
     this.points = vertices; 

} 

.

public class Rectangle { 

     private int sides; 
     private Point topCorner; 
     private int width; 
     private int length; 



    public Rectangle(Point corner, int w, int l){ 

     this.sides = 4; 
     this.topCorner = corner; 
     this.width = w; 
     this.length = l; 

} 

public class Circle { 

     private Point center; 
     private int radius; 

    public Circle(Point center, int radius){ 

     this.center = center; 
     this.radius = radius; 

} 

이러한 모든 클래스

같은 방법 번역이 있고, 규모. 그 예가 여기에 나와 있습니다.

//For the Rectangle Class 
    public void translate(int dx, int dy){ 

     topCorner.translate(dx, dy); 

} 

내 주 수업에 문제가 있습니다. 3 점을 만들고 3을 모두 배열로 사용하여 삼각형을 만들고 2 점을 직사각형과 원의 점으로 사용했습니다. 이제 모든 3 개의 객체에 대해 translate 메소드를 호출하면 값이 두 배가됩니다. 내 실수는 "p1" "p2"및 "p3"에 대한 참조를 어딘가에 전달했다고 생각하기 때문입니다. 오브젝트 값 대신 값을 변경합니다. 여기서 코드이고, I는

public class GraphicsDemo { 


public static void main(String[] args) { 
    Point p1 = new Point(0,20); 
    Point p2 = new Point(20,0); 
    Point p3 = new Point(30,30); 


    Point[] vertices = {p1,p2,p3}; 

    Triangle t = new Triangle(vertices); 
    Rectangle r = new Rectangle(p1,10,15); 
    Circle c = new Circle (p2, 25); 


    System.out.println("Triangle" + "\n" + t.toString() + "\n" + "area:" + t.area() + "\n" + "perimeter: " + t.perimeter()); 
    System.out.println("Reactangle" + "\n" + r.toString() + "\n" + "area:" + r.area() + "\n" + "perimeter: " + r.perimeter()); 
    System.out.println("Circle" + "\n" + c.toString() + "\n" + "area:" + c.area() + "\n" + "perimeter: " + c.perimeter()); 

    c.translate(10, 15); 
    t.translate(10, 15); 
    r.translate(10, 15); 

System.out.println("Triangle" + "\n" + t.toString() + "\n" + "area:" + t.area() + "\n" + "perimeter: " + t.perimeter()); 
    System.out.println("Reactangle" + "\n" + r.toString() + "\n" + "area:" + r.area() + "\n" + "perimeter: " + r.perimeter()); 
    System.out.println("Circle" + "\n" + c.toString() + "\n" + "area:" + c.area() + "\n" + "perimeter: " + c.perimeter());; 
이것의 출력은

후 출력을 설명하는 것 대신에 점이 하나 이상의 사용되는 경우 (20, 30)가 추가되는 형태 좌표, 10 및 15를 추가 모양. 나는 이것이 실제로 오브젝트 대신에 포인트의 값을 변경하고 있기 때문에 이것이 확실하다고 생각합니다.하지만 이것을 변경하는 방법을 모른다.

미리 도움을 주실 수있는 분께 감사드립니다. 제가 많은 일을 시도하고 벽에 맞서 싸우는 경험이 처음입니다.

답변

0

코드의 가장 중요한 부분을 표시하지 못했지만 분석이 정확한 것 같습니다. 번역 코드에서 실제로 새 포인트 인스턴스를 생성하고 대체해야합니다.

일반적으로 개체를 수정하지 않고 변경하지 않는 것이 좋습니다. 이것을 확실하게하는 가장 좋은 방법은 설정자를 건너 뛰는 것입니다.

class Point { 
    Point(int x, int y) { this.x = x; this.y = y; } 
    int getX() { return x; } intGetY() { return y; } 

    /** Create a new point displaced by given coordinates. */ 
    Point translate(int deltaX, int deltaY) 
    { 
    return new Point(this.getX() + deltaX, this.getY() + deltaY); 
    } 
} 
0

가정이 정확하다고 가정하면 참조가 전달됩니다. Circle, Triangle, Rectangle은 모두 생성자의 다른 모양과 공통된 점을 하나 이상 사용합니다. 삼각형과 같은 점 (p1)을 취하는 사각형을보십시오.

Point[] vertices = {p1,p2,p3}; 

Triangle t = new Triangle(vertices); 
Rectangle r = new Rectangle(p1,10,15); 
Circle c = new Circle (p2, 25); 

간단한 솔루션은 아래의 Triangle 클래스에서했던 것처럼 생성자의 포인트를 복제하는 것입니다. 즉, 두 도형은 같은 x와 y를 공유하지만 처음에는 한 도형의 변경 사항이 다른 도형에 직접 영향을 미치지 않습니다.

클래스는 개체 참조입니다. 따라서 별도의 객체를 만들기 위해 새 객체 참조를 만들어야합니다. 이것은 무엇입니까.clone() 메서드 클래스 클래스에 point 클래스를 추가하여 점 내부를 복사하고 정확한 복사본을 만듭니다. 그런 다음 다른 메소드의 생성자가 피드 메소드에서 clone 메소드를 호출하여 사용자가 제공 한 포인트 사본 만 작업합니다.

class Point{ 

public int x; 
public int y; 

Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
} 

public Point clone(){ 

    return new Point(x,y); 

} 

}

class Triangle{ 

final static int m_sides = 3; //constant 
Point[] m_points; 

Triangle(Point[] points){ 

    //You need to clone your ponits. 
    m_points = new Point[]{ 
      points[0].clone(), 
      points[1].clone(), 
      points[2].clone()}; 

} 
0

그들은 실제로 같은 객체. 나. 삼각형 t에는 p1이있다. 사각형 p1을 변경하면 삼각형 p1도 변경됩니다.

포인트가 독립적이어야한다는 점에서 딥 클론을 사용해야합니다.

관련 문제