对象初始化数组

问题描述:

好的。所以我试图初始化一个对象数组。 ID是阵列的位置。但是每次我运行它时,它总是会将当前输入的最后一个ID(不管我输入什么ID,它都返回输入的最后一个ID)。因此,这里的全码:对象初始化数组

public class Main { 
private static String answerString = "Start"; 
private static final double TPS = 0.05; 
private static final double TVQ = 0.09975; 
private static final int BILLET = 800; 
private static double prixTotal; 
public static int persNum; 
private static int siege1 = 35; 
private static int siege0 = 1; 
private static double prixBilletAv, prixTPS, prixTVQ, prixBilletAp; 
private static int answerInt; 
public static Scanner scan = new Scanner(System.in); 
public static Person[] pers = new Person[9999]; 


public static void main(String[] args) { 

    System.out.println("Bienvenue à bord de SonicXpress!"); 
    System.out.println(""); 
    System.out.println("Loading. . ."); 

    for(int i = 0; i < 9999; i++){ 
     System.out.println("yo"); 
     pers[i] = new Person(); 
    } 

    System.out.println("Done loading!"); 
    System.out.println(""); 
    while(!"Exit".equals(answerString)) 
     begin(); 
    } 
public static void begin(){ 
    System.out.println("Que veux-tu faire? (Creer , Check , Total , Exit) : "); 
    answerString = scan.next(); 

    if("Creer".equalsIgnoreCase(answerString)){ 
     createPers(); 
    }else{ 
     if("Check".equalsIgnoreCase(answerString)){ 
      checkPers(); 
     }else{ 
      if("Exit".equalsIgnoreCase(answerString)){ 
       System.out.println("Exiting"); 
       System.exit(0); 
      }else{ 
       if("Total".equalsIgnoreCase(answerString)){ 
        total(); 
       }else{ 
        System.err.println("Bad value!"); 
        System.exit(0); 
       }  
      } 
     } 
    } 
} 
public static void createPers(){ 

    System.out.print("Entrez le numéro du client(ID) :\n"); 
    answerInt = scan.nextInt(); 

    persNum = answerInt; 
    pers[persNum].setID(answerInt); 

    System.out.print("Entrez le nom du client(name) : \n"); 
    answerString = scan.next(); 

    pers[persNum].setName(answerString); 

    System.out.print("Entrez l'age du client : \n"); 
    answerInt = scan.nextInt(); 

    pers[persNum].setAge(answerInt); 

    System.out.print("Entrez la classe (0 = première classe et 1 = classe touriste): \n"); 
    answerInt = scan.nextInt(); 

    pers[persNum].setClasse(answerInt); 
    if(pers[persNum].getClasse() == 1){ 
     pers[persNum].setSiege(siege1); 
     siege1 ++; 
    }else{ 
     if(pers[persNum].getClasse() == 0){ 
      pers[persNum].setSiege(siege0); 
      siege0++; 
     } 
    } 
} 

public static void checkPers(){ 
    System.out.print("Entrez le numéro du client ID : \n"); 
    answerInt = scan.nextInt(); 
    prixBilletAv = BILLET + 10; 
    System.out.println(answerInt); 
    persNum = answerInt; 
    System.out.println(persNum); 
    System.out.println("--- Réservation : "); 
    System.out.println("Le nom du client est : " + pers[answerInt].getName()); 
    System.out.println("L'age du client est : " + pers[answerInt].getAge()); 
    System.out.println("La classe du client est : " + pers[answerInt].getClasse()); 
    System.out.println("Le numéro de siège du client est : " + pers[answerInt].getSiege()); 
     if (pers[persNum].getAge() < 12 || pers[answerInt].getAge() >= 60){ 
      prixBilletAv = BILLET - 50; 
     } 
     if (pers[persNum].getClasse() == 0){ 
      prixBilletAv = prixBilletAv + 100; 
     } 
     prixTVQ = prixBilletAv * TVQ ; 
     prixBilletAp = prixBilletAv + prixTVQ; 

     prixTPS = prixBilletAv * TPS; 
     prixBilletAp = prixBilletAp + prixTPS; 

     pers[persNum].setPrixBillet(prixBilletAp); 

    System.out.println("Le cout du billet est : " + prixBilletAv); 
    System.out.println("TPS : " + prixTPS); 
    System.out.println("TVQ : " + prixTVQ); 
    System.out.println("Montant à payer : " + pers[persNum].getPrixBillet()); 
} 

public static void total(){ 
    for (int i = 0; i < 9999; i++){ 
     prixTotal = prixTotal + pers[i].getPrixBillet(); 
    } 
    System.out.print("Montant total des billets vendus = " + prixTotal + "\n"); 
    System.out.println("-------------------------------------------------------------------------------------"); 
} 

的问题是,每当我试图检查特定的ID它给了我进入了最后一个。对于为例,如果我set Id = 1270name = Joeage = 43等为对象1和ID = 1824name = Bobage = 24 for object 2, when I check, it will automatically output object 2 no matter what ID`我把

而对于第二类:

class Person { 
private static int ID; 
private static String name; 
private static int age; 
private static int classe; 
private static double prixBillet; 
private static int siege; 

/** 
* @return the ID 
*/ 
public static int getID() { 
    return ID; 
} 

/** 
* @param aID the ID to set 
*/ 
public static void setID(int aID) { 
    ID = aID; 
} 

/** 
* @return the name 
*/ 
public static String getName() { 
    return name; 
} 

/** 
* @param aName the name to set 
*/ 
public static void setName(String aName) { 
    name = aName; 
} 

/** 
* @return the age 
*/ 
public static int getAge() { 
    return age; 
} 

/** 
* @param aAge the age to set 
*/ 
public static void setAge(int aAge) { 
    age = aAge; 
} 

/** 
* @return the classe 
*/ 
public static int getClasse() { 
    return classe; 
} 

/** 
* @param aClasse the classe to set 
*/ 
public static void setClasse(int aClasse) { 
    classe = aClasse; 
} 

/** 
* @return the prixBillet 
*/ 
public static double getPrixBillet() { 
    return prixBillet; 
} 

/** 
* @param aPrixBillet the prixBillet to set 
*/ 
public static void setPrixBillet(double aPrixBillet) { 
    prixBillet = aPrixBillet; 
} 

/** 
* @return the siege 
*/ 
public static int getSiege() { 
    return siege; 
} 

/** 
* @param aSiege the siege to set 
*/ 
public static void setSiege(int aSiege) { 
    siege = aSiege; 
} 

THX在您的帮助:)

+0

你的init代码看起来不完整,但是有什么好的和非常基本的 - 它只是把对象放入数组中。如果你发布更多的代码,它可能会更好...... – Krease 2014-10-05 05:37:12

+0

我也有点困惑。当你说它给你输入的最后一个你的意思是:如果你输入5作为变量“answerString”它会返回5为personID? – 2014-10-05 05:39:15

+0

把setID()方法的代码 – 2014-10-05 05:39:54

通过您的代码和您的意见看完后,我想我明白这个问题。您好像不明白static的意思,所以让我简单介绍一下:

如果一个变量或方法是static,这意味着[所述变量]不是由[this class]创建的ANY对象的一部分。 所以,例如:

public class Test{ 
    public static int TestNum = 0; 

    public static void setTestNum(int newNum){ 
     TestNum = newNum; 
    } 

    public static int getTestNum(){ 
     return TestNum; 
    } 

    public static void main(String args[]){ 
     Test test1 = new Test(); 
     test1.setTestNum(5); 

     Test test2 = new Test(); 
     System.out.println(test2.TestNum); 
    } 
} 

上面的例子输出5,因为TestNumstatic变量。它不是test1对象或test2对象的变量。它是class Test的变量。这有意义吗?

因此,在您的代码中,您将重复更改静态变量,并且每当您引用任何Person对象时,由于所有变量/方法都是static,因此它会引用该类的变量。这就是为什么它只是引用最近创建的Person对象。

要解决这个问题,您必须简单地摆脱方法前面的static。首先要明白方法/变量何时应该是static似乎有点困难,但随着时间的推移,当你工作并变得更有经验时,它开始变得越来越有意义。

如果我是你,我还会通过this阅读更深入和有说服力的解释。

变化

private static int ID; 

private int ID; 

如果变量为static,则表示它属于该类。也就是说,无论您创建多少个对象,堆上的某个地方只有一个id。您每次修改id的内容,最后一次修改是保留的内容。如下图所示

public void setID(int aID) { 
    this.ID = aID; 
} 

getID()

public int getID() { 
    return this.ID; 
} 

另外

变化setID,正确的语法从非静止象素块内访问任何static构件或方法是

className.staticMemberVariable 
className.staticMethodName 

如果从访问块,你不必与classname

例如有资格的static字段或方法的名称,如果id是静态

public static void main (String...a) { 
    //here just say id 
    id = 5; 
} 
+0

Nope没有工作它仍然给我编辑的最后一个对象 – Lacni 2014-10-05 06:19:42

+1

好吧,所以我删除了所有的getters和setters静态的东西,它的工作! – Lacni 2014-10-05 06:31:48