Создание метода в JAVA для печати содержимого ArrayList, вызывающего указанный формат c другого класса - PullRequest
0 голосов
/ 24 января 2020

В этом примере я хотел бы добавить учеников школы в ArrayList и распечатать список массивов с форматом полиморфизма из другого метода, определенного в другом классе.

import java.util.ArrayList;

class Student{
   public static String name;
   public static String gender;
   public static int age;

   //setting default values for the member variables
   public Student(){
       name = "default name";
       gender = "default gender";
       age = 0;
   }    

  //constructor of the parameters for the name, gender, and age.
   public Student(String name, String gender, int age){
       Student.name = name;
       Student.gender = gender;
       Student.age = age;
   }

   // Polymorphism to print with a specific format
   public static void printInfo(){
       System.out.println(name+", "+gender+", "+age+"\n");
   }
}

// creating a class for Male students
class Male extends Student{
    private static String gender;

    public Male(String name, int age){
        super(name, gender, age);

        Male.gender = "Male";
    }
}

// creating a class for Female students
class Female extends Student{
    private static String gender;

    public Female(String name, int age){
        super(name, gender, age);

        Female.gender = "Female";
    }
}

// create a class for school to collect all the students
class School{
      static ArrayList<Student> students;
      public static void addStudent(Student a){
          ArrayList<Student> students = new ArrayList<Student>();
          students.add(a);
      }
      public void printAllInfo(){
         //call the Student.printInfo method from the Student class
      }
}

public class SchoolBuilder{
    public static void main(String[] args){
       School.addStudent(new Male("Sam",13));
       School.addStudent(new Male("John",11));
       School.addStudent(new Female("Elle",12));
       School.addStudent(new Male("Paul",12));
       School.addStudent(new Female("Javinia",11));
       School.addStudent(new Male("Paperino",12));

       //PRint all by calling School.printAllInfo should print the formatted ArrayList 
    }
}

Вывод должен быть таким :

  Sam, Male, 13
  John, Male, 11
  Elle, Female, 12
  Paul, Male, 12
  Javinia, Female, 11
  Paperino, Male, 12

Я новичок в JAVA и просто не могу понять, как это сделать. Кажется, это легко. Я сделал два класса для пола, потому что позже легко добавить CSV-файл для всех мужчин или женщин и добавить их в набор данных, в котором будут соответственно указаны мужские и женские классы.

Спасибо за ваше время и помощь с этим.

Ответы [ 3 ]

2 голосов
/ 24 января 2020

В общем, мы делаем это, переопределяя метод toString() некоторого класса, а затем распечатывая его.

Примите следующее как конструктивную критику: здесь есть куча проблем.

  1. В этом случае вы хотите избежать контекста stati c, поскольку статические переменные принадлежат классу. Например, не у каждого учащегося будет одинаковое имя.
  2. Точно так же вы бы не назвали Student.function(), вы бы позвонили this.function(), чтобы назвать это только для этого ученика, а не ученика класса. this является экземпляром Student.
  3. Вы определенно не хотите делать ArrayList<Student> students = new ArrayList<Student>(); в вашем методе addStudent (). Вы сбрасываете свой список учеников каждый раз, когда добавляете ученика. Сохраните это в объявлении уровня класса или еще лучше, добавьте конструктор.
import java.util.ArrayList;

class Student{
   public String name;
   public String gender;
   public int age;

   //setting default values for the member variables
   public Student(){
       name = "default name";
       gender = "default gender";
       age = 0;
   }    

  //constructor of the parameters for the name, gender, and age.
   public Student(String name, String gender, int age){
       this.name = name;
       this.gender = gender;
       this.age = age;
   }


   // Polymorphism to print with a specific format
   public String printInfo(){
       return name+", "+gender+", "+age+"\n";
   }
}

// creating a class for Male students
class Male extends Student{
    private static String gender;

    public Male(String name, int age){
        super(name, gender, age);

        Male.gender = "Male";
    }
}

// creating a class for Female students
class Female extends Student{
    private static String gender;

    public Female(String name, int age){
        super(name, gender, age);

        Female.gender = "Female";
    }
}

// create a class for school to collect all the students
class School{
      ArrayList<Student> students = new ArrayList<Student>();

      public void addStudent(Student a) {
          students.add(a);
      }

      public void printAllInfo(){
         //call the Student.printInfo method from the Student class
      }

      public String toString() {
          String string = "";

          for (Student s : students) {
              string += s.printInfo();
          }

          return string;
      }
}

public class Work{
    public static void main(String[] args){
        School sch = new School();

       sch.addStudent(new Male("Sam",13));
       sch.addStudent(new Male("John",11));
       sch.addStudent(new Female("Elle",12));
       sch.addStudent(new Male("Paul",12));
       sch.addStudent(new Female("Javinia",11));
       sch.addStudent(new Male("Paperino",12));

       System.out.println(sch.toString()); 
    }
}
1 голос
/ 24 января 2020

В вашей реализации есть какая-то ошибка:

  1. Объект Student не должен иметь полей static. static означает, что они относятся не к указанному c объекту, а к самому классу.
    Объект является конкретной c реализацией класса. Вы определяете класс Student, чтобы определить, как выглядит ученик, с указанием c, который вы создаете.
    Когда вы объявляете класс, вы говорите, что у ученика обычно есть имя, пол и возраст.
    Когда вы истанчиваете ученика с помощью конструктора (new Student("Sam", "Male", 13)), вы определяете конкретную реализацию c.

 class Student {
      public String name;
        public String gender;
        public int age;

        //setting default values for the member variables
        public Student(){
            name = "default name";
            gender = "default gender";
            age = 0;
        }    

       //constructor of the parameters for the name, gender, and age.
        public Student(String name, String gender, int age){
            this.name = name;
            this.gender = gender;
            this.age = age;
        }

Класс Male и Female должны быть изменены. Нет ничего плохого в том, чтобы расширить класс Student, чтобы установить значение по умолчанию для поля gender. Было бы более полезно расширить его, если, например, у класса Male есть определенное поле c (например, favouriteSoccerPlayer), которое вместо обычного ученика не должно быть. В этом случае класс Male унаследует поля от родительского класса (Student) и добавит еще одно дополнительное поле:

    class Male extends Student {
            private String favouriteSoccerPlayer;

       public Male(String name,  int age) {
           super(name, "Male", age); // call the constructor of the super class
       }
       public Male(String name,  int age, String favouriteSoccerPlayer) {
           super(name, "Male", age); // call the constructor of the super class
           this.favouriteSoccerPlayer = favouriteSoccerPlayer;
       }

       // getter and setter for only this field
    }

, тогда вы можете, например, сделать что-то вроде этого:

Male male = new Male("John", 32, "Maradona");
System.out.println(male.getName());

и вы вызовете метод, который объект Male наследует от Student класса.

1 голос
/ 24 января 2020

Это будет мужской класс, то же самое относится и к женскому:

        // creating a class for Male students
class Male extends Student{
    private static final String gender = "Male";//This should be constant for all instances of class and because of that it is "static final"

    public Male(String name, int age){
        super(name, gender, age);
    }
}

В следующей школе не будет никакой вещи c.

    import java.util.ArrayList;

// create a class for school to collect all the students
class School {
    private ArrayList<Student> students; //Should not be static, and initialization moved in constructor

    public School() {
        students = new ArrayList<>();
    }

    public void addStudent(Student a) {
        students.add(a);
    }

    public void printAllInfo() {
        for (Student s : students) {
            s.printInfo();
        }
    }
}

Наконец, основной класс должен создайте экземпляр School, добавьте студентов и напечатайте их:

public class SchoolBuilder{
    public static void main(String[] args){
        School school=new School();
        school.addStudent(new Male("Sam",13));
        school.addStudent(new Male("John",11));
        school.addStudent(new Female("Elle",12));
        school.addStudent(new Male("Paul",12));
        school.addStudent(new Female("Javinia",11));
        school.addStudent(new Male("Paperino",12));

        school.printAllInfo();
    }
}

Наконец, этот метод в Student не должен иметь \ n в строке, так как он добавит еще одну новую строку.

    // Polymorphism to print with a specific format
public void printInfo(){
    System.out.println(name+", "+gender+", "+age+"\n");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...