Java Can';t计算对象的数量
我建立了一个程序,有这个方法,我也想 计算我创建的对象数。但是在运行程序之后。它说正在创建0个对象。 有人知道为什么这是不正确的吗?应该说, 正在创建4个对象。 这是我的密码:Java Can';t计算对象的数量,java,Java,我建立了一个程序,有这个方法,我也想 计算我创建的对象数。但是在运行程序之后。它说正在创建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
/**
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.");
}
}
只有在调用无参数的
循环
构造函数时,才能增加numCircles
。但你永远不会调用那个特定的构造函数;您可以调用其他构造函数
在所有构造函数上递增numCircles
顺便说一句,由于
numCircles
是static
,因此返回此数字的方法getNumCircles
也应该是static
,您可以如下调用它:Circle.getNumCircles()
u应该用0初始化numCircles
,并在每次构造函数调用时增加它,特别是因为有多个构造函数,所以必须跟踪它们都是递增的numCircles
。您可以从另一个构造函数的内部调用一个构造函数,因此您可能不会向每个构造函数添加相等的语句。您为创建对象而调用的构造函数(带参数的构造函数)不会调用递增计数器的无参数构造函数。尝试:
public Circle(double radius)
{
this();
this.radius = radius;
}
public Circle(Circle c3)
{
this();
radius = c3.radius;
}
您必须显式调用
this()
,否则构造函数将隐式调用super()
,在您的情况下,它是对象
构造函数。将代码移动到'numCircles++;'圆(双半径)构造器。创建圆对象时不调用Circle()
public Circle(double radius)
{
this.radius = radius;
numCircles++;
}
正如其他答案所提到的,您应该首先在每个构造函数中通过
this()
调用零参数构造函数,以确保它被执行。目前,您的代码不会调用零参数构造函数中的代码,因为它从未被直接调用,在调用其他构造函数时也不会被调用
或者,您可以在声明下面添加一个内联初始化块,例如:
private static int numCircles = 0;
// Increment numCircles for every object constructed.
{
numCircles++;
}
这不是很标准,可能是更糟糕的做法,但它将自动确保其执行,而无需在任何构造函数中增加numCircles。或在所有其他构造函数的开头调用
This()
。@ILMTitan您是对的;在这种情况下,调用this()
也会起作用。+1用于初始化块。我认为这很好,因为这是一个单独的问题。