对象初始化数组
好的。所以我试图初始化一个对象数组。 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 = 1270
,name = Joe
,age = 43
等为对象1和ID = 1824
,name = Bob
,age = 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在您的帮助:)
通过您的代码和您的意见看完后,我想我明白这个问题。您好像不明白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,因为TestNum
是static
变量。它不是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;
}
你的init代码看起来不完整,但是有什么好的和非常基本的 - 它只是把对象放入数组中。如果你发布更多的代码,它可能会更好...... – Krease 2014-10-05 05:37:12
我也有点困惑。当你说它给你输入的最后一个你的意思是:如果你输入5作为变量“answerString”它会返回5为personID? – 2014-10-05 05:39:15
把setID()方法的代码 – 2014-10-05 05:39:54