создание массива объектов из абстрактных и подклассов Java - PullRequest
0 голосов
/ 10 ноября 2011

Надеясь, что кто-то сможет мне помочь или направить меня в правильном направлении. У меня есть текстовый файл с количеством записей

CUST001, Джон Джонс, 555 0505, 19 сентября 1981 г.
CUST002, PeterParker, 555 1234, 0,2
CUST003, Майкл Майклз, 555 4321, 19.09.1981
и т. д.

У меня есть абстрактный суперкласс с конструктором и средствами доступа для общих свойств и подкласса. у меня тогда есть другой класс, также с конструктором и средствами доступа.

Я читаю в каждой строке и делю ее на «,» и читаю это во временный массив. Затем я создаю свой пустой массив, чтобы прочитать в него свойства моего суперкласса, и с помощью конструктора я создаю различные объекты.

проблема, с которой я столкнулся: Обычный класс с конструктором - это работа префекта. Я распечатываю свои объекты после того, как они были созданы, и вот они.

Хотя мой подкласс возвращает только значения null, null, null Поэтому я предполагаю, что есть проблема с моим суперклассом и подклассом.

создание объектов с использованием конструктора конкретного класса:

Product[] prod = new Product[20]; 
BufferedReader inFile = new BufferedReader (new FileReader("product.txt"));
String inputLine = inFile.readLine();
for (int i = 0; i < 6 ; i++)
{
    String[] tmpProd = inFile.readLine().split(","); 
    prod[i] = new Product( tmpProd[0], 
                           tmpProd[1], 
                           tmpProd[2],
                           Float.parseFloat(tmpProd[3]),
                           tmpProd[4].charAt(0));
}

«пытается» создать объекты из суперкласса (Customer) и подкласса (STCustomer):

Customer[] stdCust= new STCustomer[20];
BufferedReader inFileCust = new BufferedReader (new FileReader ("customer.txt"));
String inputCust = inFileCust.readLine();
for (int i = 0; i < 6; i++)
{
    String[] tmpCust = inFileCust.readLine().split(",");
    GregorianCalendar d = new GregorianCalendar(year, month -1, date);
    stdCust[i] = new STCustomer(    tmpCust[0],
                                 tmpCust[1], 
                                 Long.parseLong(tmpCust[2]), 
                                 d);//the block to convert date works - omitted here
}  

Это правильный способ создания объектов?

Customer[] stdCust= new STCustomer[20];

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Проблема с вашим конструктором подкласса.Вы должны явно вызвать нужный конструктор суперкласса, иначе компилятор добавит super() в качестве первого оператора в вашем конструкторе подкласса.Ниже приведен пример.

import java.util.Date;

public class Test {
         public static void main(String... abc){
             Customer[] a = new STCustomer[20];
             a[0] = new STCustomer();
             a[1] = new STCustomer("Hello","World",12L,new Date());
             a[1] = new STCustomer("Hello","World",12L);
         }
}

class Customer{
    public Customer(){
        System.out.println("Customer()");
    }

    public Customer(String a, String b, long c,Date d){
        System.out.println("Customer(String a, String b, long c,Date d)");
            // Set values to fields
    }
}

class STCustomer extends Customer{
    public STCustomer(){}

    public STCustomer(String a, String b, long c,Date d){

    }

    public STCustomer(String a, String b, long c){
      super(a,b,c,new Date());
    }
}

и вывод

Customer()
Customer()
Customer(String a, String b, long c,Date d)
0 голосов
/ 12 ноября 2011

Это была одна из многих моих ошибок. При расширении класса клиента я не добавил «super (cID, cName, cPhone). Это привело к возвращению нулевого значения.

class STCustomer extends Customer{
//instance variables
private GregorianCalendar stCustJoinDate; 

//constructor
public STCustomer (String cID, String cName, String cPhone, 
        GregorianCalendar stCJoinDate)
{
    super(cID, cName, cPhone );
    stCustJoinDate = stCJoinDate;
}

//accessor
public GregorianCalendar getSTCJoinDate() {return stCustJoinDate;}
0 голосов
/ 10 ноября 2011

Нет, вы не должны использовать массивы. Вместо этого используйте List<Customer> и радуйтесь его простому API. Вы можете использовать методы add и size, и вам не нужно отслеживать размер самостоятельно. У вас также может быть более 20 клиентов, и код все равно будет работать.

Вот пример кода:

List<Customer> customers = Lists.newArrayList();

...
while ((line = bufferedReader.readLine()) != null) {
  ...
  customers.add(new Customer(...));
}

for (Customer customer : customers) {
  System.out.println(customer.getId());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...