2015-04-28 2 views
0

Я думаю, что может быть несколько ошибок, но в основном я хочу добавить Корабль каждый раз, когда цикл проходит снова в моем классе дайвера. Но по какой-то причине мой метод toString выводит только последнюю добавленную или последнюю итерацию цикла do while. Я могу опубликовать весь код, если это необходимо, но я предполагаю, что проблема находится в одном из этих двух классов.ArrayList не расширяется при добавлении объектов через цикл

корабль класса

import java.util.Scanner; 


public class ShipDriver 
{ 


static Ship cS; 
static Ship cargo; 


public static void main(String[] args) 
{ 
    System.out.println("----------------------Ship Company----------------------"); 
    String name, ans; 
    int year, passenger = 0, ton = 0, oneTwo; 
    Scanner kb = new Scanner(System.in); 
    ShipCompany sh = new ShipCompany(); 

    do 
    { 
     System.out.println("Enter the ship's name:"); 
     name = kb.next(); 

     System.out.println("Enter the " + name + " build year:"); 
     year = kb.nextInt(); 


     System.out.println("Enter 1 for cruise ship or 2 for a cargo ship"); 
     oneTwo = kb.nextInt(); 



     if(oneTwo == 1) 
     { 
      System.out.println("Enter the number of passengers for the " + name); 
      passenger = kb.nextInt(); 
     } 
     else 
     { 
      System.out.println("Enter the maximum capacity of the " + name); 
      ton = kb.nextInt(); 
     } 


     cS = new CruiseShip(name, year, passenger); 
     cargo = new CargoShip(name, year, ton); 
     sh.add(getInfo(oneTwo)); 
     System.out.println("Do you want enter another ship's information? y/n"); 
     ans = kb.next(); 

    }while(ans.equals("y") || ans.equals("Y") || ans.equals("Yes") || ans.equals("yes")); 

    System.out.println(sh.toString()); 
    kb.close(); 
} 
public static Ship getInfo(int num) 
{ 
    if(num == 1) 
    { 
     return cS; 
    } 
    else 
     return cargo; 

} 
} 

ShipCompany Класс

import java.util.ArrayList; 

public class ShipCompany 
{ 
static ArrayList<Ship> arr; 
Ship ship = new CargoShip(); 
Ship ship2 = new CruiseShip(); 

public ShipCompany() 
{ 
    arr = new ArrayList<Ship>(); 
} 

public static void add(Ship o) 
{ 
    arr.add(o); 
} 

public String toString() 
{ 
    for(int i = 0; i < arr.size(); i++) 
    { 
     if(ShipDriver.getInfo() instanceof CargoShip) 
     { 
      return ship.toString(); 
     } 
     else 
      return ship2.toString(); 
    } 
} 
} 

Если вам нужны другие 3 класса я могу отправить их, как я сказал, но я уверен, что эта проблема может быть с моим методом toString или моим методом добавления. Я просто не знаю, как это исправить. Любая помощь приветствуется.

+1

Посмотрите, можете ли вы реорганизовать это, чтобы не использовать какие-либо статические переменные – Misha

ответ

2

Когда вы вызываете конструктор CruiseShip или CargoShip, он также вызывает конструктор суперклассов, где старое значение статического файла arr потеряно.

0

Я думаю, что из-за cS и груза были объявлены как статические поля. Пожалуйста, объявите их как локальные переменные основного метода (только до цикла цикла) и реорганизуйте метод getInfo, конечно.

+0

Как бы реорганизовать метод getInfo? должен ли я создать геттер и сеттер для объектов CargoShip и CruiseShip (можете ли вы это сделать?)? У меня возникли проблемы с пониманием того, как я смогу создать те же экземпляры этих объектов в методе getInfo. Я ничего не могу проверить, потому что у меня нет моего ноутбука, но, может быть, вы могли бы объяснить это мне. – DashingShorty

+0

Существует несколько способов: один из способов - передать как cS, так и груз в качестве параметров методу getInfo. Но действительно, вы можете полностью удалить метод getInfo(), инициализируя и добавляя корабли в список внутри вашего if (oneTwo == 1) ... else ... –

Смежные вопросы