每次我实例化新对象时,属性都会回到零

时间:2017-05-27 12:19:41

标签: java object constructor runtime-error member

我正在构建一个类Rating,如下所示:

public class Rating{
//class attributes
private Movie movie;
private PremiumUser premiumUser;
private double rating;
private int id;

private int count;
protected static Rating [] ratings = new Rating [100];

public Rating(Movie movie, PremiumUser premiumUser, double rating){
    this.movie = movie;
    this.premiumUser = premiumUser;
    this.rating = rating;
    ratings[count] = this;
    count += 1;
    this.id = count;

}
public void setRating(int rating){
    this.rating = rating;
}

public void setMovie(Movie movie){
    this.movie=movie;
}

public void setPremiumUser(PremiumUser premiumUser){
    this.premiumUser = premiumUser;
}

public int getID(){
    return id;
}

public PremiumUser getPremiumUser(){
    return premiumUser;
}

public Movie getMovie(){
    return movie;
}

public double getRating(){
    return rating;
}
@Override
public String toString(){
    return ("Rating ID: " +id + "\nMovie: "  + movie.getTitle() + "\nPremium User: " + premiumUser.getUsername() + "\nRating: " + rating);
}
}

但每次我创建一个新对象Rating时(如此):

 Rating rating1 = new Rating(movie1,marios, 9.0);
    Rating rating2 = new Rating(movie2,zarko, 8.5);
    Rating rating3 = new Rating(movie1, jdoe, 10);
    System.out.println(Rating.ratings[0] + "" + Rating.ratings[1]);

我从System.out.println行得到的只是我创建的最后一个Rating对象。我不确定为什么会这样。在构造函数中调试print语句表明,每次创建新对象时,count都会返回到零。

3 个答案:

答案 0 :(得分:3)

将变量声明更改为private static int count;

<强>解释

根据您的逻辑,您的count变量会吸引所有类的实例,因此它应该是static。如果你没有放置静态,它将为该类的每个对象初始化。

希望这会有所帮助。

答案 1 :(得分:3)

count是一个实例成员,每次实例化一个新对象时,它都会获得自己的count,初始化为int的默认值{{1} }。它应该是0成员,在所有static对象之间共享:

Rating

答案 2 :(得分:2)

  

首先,您想了解static关键字:

     
      
  • 属性和方法(类的成员)可以定义为static
  •   
  • static成员不属于单个对象。
  •   
  • static成员对所有实例(同一类的对象)都是通用的。
  •   
  • static成员是静态内存中的存储(每个人都可以使用的公共内存位置)。
  •   

static修饰符表示rating[]数组对于整个类中的所有Rating都是通用的,而不是单个对象。

count变量不是。因此,每次创建对象count时,变量值都会变为0。因为它对每个物体都是个体的。

为避免这种情况(解决方案):

static修饰符添加到count变量中。它应该如下所示:

private static int count;