我正在尝试计算调用方法的次数。我目前有3个班,Circle.java,Picture.java和PictureTest.java
在circle.java中有;
public class Circle
{
private int diameter;
private int xPosition;
private int yPosition;
private String color;
private boolean isVisible;
private int instances;
/**
* Create a new circle at default position with default color.
*/
public Circle()
{
diameter = 30;
xPosition = 20;
yPosition = 60;
color = "blue";
isVisible = false;
instances = 0;
instances++;
System.out.println(instances);
}
在Picture.java中:
public class Picture
{
private Circle sun;
/**
* Constructor for objects of class Picture
*/
public Picture()
{
// nothing to do... instance variables are automatically set to null
}
/**
* Draw this picture.
*/
public void draw()
{
sun = new Circle();
sun.changeColor("yellow");
sun.moveHorizontal(180);
sun.moveVertical(-10);
sun.changeSize(60);
sun.makeVisible();
sun = new Circle();
sun.changeColor("yellow");
sun.moveHorizontal(180);
sun.moveVertical(-10);
sun.changeSize(60);
sun.makeVisible();
sun = new Circle();
sun.changeColor("yellow");
sun.moveHorizontal(180);
sun.moveVertical(-10);
sun.changeSize(60);
sun.makeVisible();
}
PictureTest.java是主要的地方:
public class PictureTest
{
public static void main(String[] args)
{
Picture p = new Picture();
p.draw();
}
}
当我运行它时,而不是因为有三个太阳而打印3,它会打印:
1
1
1
我不完全确定为什么会这样,但我认为这可能与我从Circle类打印的事实有关,因此每次创建一个圆圈时它都会打印1.我试过了改变它,以便它从PictureTest中的main打印实例,但我无法使它工作。
谢谢!
答案 0 :(得分:2)
将您的private int instances;
变量更改为静态
答案 1 :(得分:2)
instances
Circle
的不同实例
如果您不希望出现这种情况,请将instances
静态
private static int instances;
答案 2 :(得分:2)
instances = 0;
instances++;
instances
将始终等于1
。
您需要做的是使instances
成为static
变量。
public class Circle
{
public static int instances = 0;
}
然后在你的构造函数类
中instances ++;
答案 3 :(得分:1)
创建静态变量,例如static int counter = 0;
,并在每个方法中增加其值:
void veryImportantMethod(){
//great code goes here
counter ++;
}
答案 4 :(得分:1)
您的变量instances
是一个成员变量,这意味着它在Object
(在本例中为Circle
对象)的成员资格范围内。在创建新的Object
时,您将创建instance
变量的新实例。
要缓解此问题,您需要创建变量static
,这意味着它将在该类的所有Object
内共享。
其他替代品也存在。例如,您可以在Circle
类之外生效,并在创建其他Circle
对象的协调下更新它。如何解决这个问题在很大程度上取决于你要解决的确切问题,但它可能就像
Circle one = new Circle(...);
circleCount++;
Circle two = new Circle(...);
circleCount++;
或者,如果您更喜欢Factory
模式
Circle circle = CircleFactory.newCircle(...);
Circle circle = CircleFactory.newCircle(...);
int count = CircleFactory.getCreatedCircleCount();
其中CircleFactory有一个像
这样的方法 private static int circleCount;
public static Circle newCircle(...) {
circleCount++;
return new Circle(...);
}
public int getCreatedCircleCount() {
return circleCount;
}
简而言之,有很多方法可以做到这一点,但是,随着时间的推移,您会发现如何选择最佳方法,考虑您正在解决的问题,维护需求以及在您避开之后使代码更具可读性的能力过去几周(或几年)一直在使用它。
答案 5 :(得分:0)
你有答案:“每次创建一个圆圈时都会打印1”。为避免这种情况,您必须将字段instances
声明为static
答案 6 :(得分:0)
尝试使用以下内容:
private static int fooCounter = 0;
private static int barCounter = 0;
private static int objectInstance = 0;
public MySuperTrackedObject(){
objectInstance++;
...
}
public MySuperTrackedObject(String aGoodName){
objectInstance++;
...
}
public void foo(){
fooCounter ++;
...
}
public void bar(){
barCounter ++;
...
}
答案 7 :(得分:0)
instances
必须为static
才能为整个类提供单个值,而不是每个实例一个值。另请注意,构造函数中的以下代码即使在将其设置为静态之后也无法正常工作:
instances = 0; //this line here will cause your instances to revert to zero
instances++; //and then, to one, no matter how many you're supposed to have