2013-06-28 4 views
2

이 메서드가있는 프로그램을 만들었고 에 내가 만든 개체 수를 계산하기를 원합니다. 그러나 프로그램을 실행 한 후에. 0 개체가 생성되었다고합니다. 왜 이것이 정확하지 않은지 알 수 있습니까? 거기에 4 개체를 만들고 있다고합니다.개체 수를 계산할 수 없습니다.

/** 
    This program implements code for a Circle class, 
    which has a radius field, set and 
    get methods, and a getArea method. 
    Author: Michael Wu. 
    */ 

    public class Circle 
    { 
     private double radius; 
     private static int numCircles; 

     public Circle(double radius) 
     { 
      this.radius = radius; 
     } 

     //SetRadius method,sets radius. 
     public void setRadius(double radius) 
     { 
      this.radius = radius; 
     } 

     //GetRadius method; returns radius. 
     public double getRadius() 
     { 
      return radius; 
     } 

     //Constructor increments numbers of circles. 
     public Circle() 
     { 
      numCircles++; 
     } 

     //Copy constuctor. 
     public Circle(Circle c3) 
     { 
      radius = c3.radius; 
     } 

     //GetNumbercircles method; get number of circles. 
     public int getNumCircles() 
     { 
      return numCircles; 
     } 

     //Copy method, copy objects. 
     public Circle copy() 
     { 
      Circle copyObject = new Circle(radius); 

      return copyObject; 
     } 

     //Call the getArea method. 
     public double getArea() 
     { 
      return radius*radius*Math.PI; 
     } 
    } 

    /** 
    This program created several circle objects and then their areas and radius will be displayed on the screen. 
    Author: Michael Wu. 
    */ 

    public class CircleDemo 
    { 
     public static void main(String[] args) 
     { 
      int numCircles; 

      //Create two circle objects. 
      Circle c1 = new Circle(3.7); 
      Circle c2 = new Circle(5.9); 
      Circle c3 = new Circle(c1); 

      //Declare a circle object. 
      Circle c4; 

      //Make c3 reference a copy of a object refferenced by c1. 
      c4 = c2.copy(); 

      //Display outputs. 
      System.out.println("The radius for circle1 is "+ c1.getRadius()); 
      System.out.println("The area for circle1 is "+ c1.getArea()); 

      System.out.println("The radius for circle2 is "+ c2.getRadius()); 
      System.out.println("The area for circle2 is "+ c2.getArea()); 

      System.out.println("The radius for circle3 is "+ c3.getRadius()); 
      System.out.println("The area for circle3 is "+ c3.getArea()); 

      System.out.println("The radius for circle4 is "+ c4.getRadius()); 
      System.out.println("The area for circle4 is "+ c4.getArea()); 

      //Get the number of circles. 
      numCircles = c1.getNumCircles(); 

      System.out.println("There are "+numCircles+" objects being created."); 
     } 
    } 

답변

3

개체를 만들기 위해 호출하는 생성자 (매개 변수를 사용하는 개체)는 카운터를 증가시키는 인수가없는 생성자를 호출하지 않습니다. 시도 :

public Circle(double radius) 
{ 
    this(); 
    this.radius = radius; 
} 

public Circle(Circle c3) 
{ 
    this(); 
    radius = c3.radius; 
} 

당신은 명시 적으로 생성자가 암시 적으로 귀하의 경우에 Object 생성자입니다 super()를 호출합니다 this()를 호출해야합니다.

+0

Thx 많이 있습니다, 친구. – zihaow

6

당신이 인수없이 Circle 생성자를 호출 할 때 만 numCircles를 증가 : 다음은 내 코드입니다. 그러나 당신은 결코 그 특정 생성자를 호출하지 않습니다. 당신은 다른 생성자를 호출합니다.

모든 생성자에 대해 numCircles이 증가합니다. numCirclesstatic 때문에

부수적으로는,이 번호를 반환하는 방법 getNumCirclesstatic해야하며, 다음과 같이 당신은 그것을 호출 할 수 : Circle.getNumCircles()가.

+8

다른 모든 생성자의 시작 부분에서'this() '를 호출하십시오. – ILMTitan

+0

@ILMTitan 네 말이 맞아. 이 경우,'this()'를 호출해도 작동합니다. – rgettman

0

u는 numCircles을 0으로 초기화하고 각 생성자 호출에서 증가시켜야합니다. 특히 여러 생성자가 있으므로 모두 증가하는 것을 추적해야합니다. numCircles. U는 다른 생성자 내부에서 하나의 생성자를 호출 할 수 있으므로 각 생성자에 equal 문을 추가하지 못할 수 있습니다.

0

'numCircles ++;'코드 이동 원 (이중 반지름) 생성자. 당신이 원 객체

public Circle(double radius) 
{ 
    this.radius = radius; 
    numCircles++; 
} 
2

을 만들 때 원()는 다른 답변이 언급 한 것처럼, 당신이 그것을 실행하도록하기 위해 먼저 생성자의 각 this()를 통해 제로 인수 생성자를 호출 할 필요가 호출되지 않습니다. 현재, 코드는 직접 호출되지 않았기 때문에 0 인수 생성자에서 코드를 호출하지 않으며 다른 생성자가 호출 될 때도 호출되지 않습니다.

private static int numCircles = 0; 
// Increment numCircles for every object constructed. 
{ 
    numCircles++; 
} 

이 덜 표준, 그리고 아마도 더 연습이지만, 그것은 자동으로 numCircles을 증가 할 필요없이 실행을 보장합니다 :

또는 대신 예를 들어, 귀하의 선언 아래 인라인 초기화 블록을 추가 할 수 있습니다 모든 생성자.

+2

+1 초기화 블록 사용. 나는 이것이 별개의 우려이기 때문에 여기에 좋은 것이라고 생각한다. – selig

+0

그래, 덜 표준이지만 작동하지 않습니다. 고마워. – zihaow

관련 문제