Как я могу получить доступ к объекту, определенному в другом классе? - PullRequest
1 голос
/ 14 марта 2020

У меня есть класс Student, конечно, это не весь код, я просто пытаюсь понять концепцию. Я хочу использовать другой объект obj в классе User, в котором создан класс колледжа obj. Класс колледжа - это тот, в котором есть другой класс obj. Я только сделал ассоциации пока не наследование, поэтому решения, связанные с ассоциациями будут полезны.

public class College
{
  private Student[] student;
  private Teacher[] teacher;
  int count;
  public College()
  {
    student = new Student[9];
    teacher = new Teacher[9];
    count = 0;
  }

  public Student[] getStudent()
  {
    return student;
  }

  public void addStudent(Student inStudent)
  {
      student[count] = new Student(inStudent);
      count++;
  }

  public void setStudent(Student[] student)
  {
    this.student = student;
  }

  public Teacher[] getTeacher()
  {
    return teacher;
  }

  public void setTeacher(Teacher[] teacher)
  {
    this.teacher = teacher;
  }

  public boolean equals(Object inObj)
  {
    boolean isEqual = true;
    College inCollege = (College)inObj;

    if(student.length == inCollege.getStudent().length)
    { 
      for(int i = 0; i < student.length; i++)
      {
        if(!student[i].equals(inCollege.student[i]))
        {
            isEqual = false;
        }
      }
    }
    if((teacher.length == inCollege.getTeacher().length) )
    {
      isEqual = false;
      for(int i = 0; i < inCollege.getTeacher().length; i++ )
      {
        if(teacher[i].equals(inCollege.teacher[i]))
        { System.out.println("im in");
          isEqual = true;
        }
      }
    }
    return isEqual;
  }
}

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Вам необходимо иметь public методы доступа (геттеры) для доступа к private членам других классов.

Сделайте это следующим образом:

import java.util.Scanner;

class Engine {
    String name;
    int year;
    String manufacturer;

    public Engine() {
    }

    public Engine(String name, int year, String manufacturer) {
        this.name = name;
        this.year = year;
        this.manufacturer = manufacturer;
    }

    // getters and setters of instance variables

    @Override
    public String toString() {
        return "Engine [name=" + name + ", year=" + year + ", manufacturer=" + manufacturer + "]";
    }
}

class Submarine {
    private String id;
    private Engine engine;

    public Submarine(String id, Engine engine) {
        this.id = id;
        this.engine = engine;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public Engine getEngine() {
        return engine;
    }

    @Override
    public String toString() {
        return "Submarine [id=" + id + ", engine=" + engine + "]";
    }
}

class ShipStorage {
    private Submarine submarine;
    private Submarine[] submarines;

    public void setSubmarine(Submarine submarine) {
        this.submarine = submarine;
    }

    public Submarine getSubmarine() {
        return submarine;
    }

    public void setSubmarines(Submarine[] submarines) {
        this.submarines = submarines;
    }

    public Submarine[] getSubmarines() {
        return submarines;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        ShipStorage store = new ShipStorage();

        // Input submarines
        Submarine[] submarines = new Submarine[3];
        String id, name, manufacturer;
        int year;
        for (int i = 0; i < submarines.length; i++) {
            System.out.print("Enter the ID of the sumarine: ");
            id = in.nextLine();
            System.out.print("Enter the name of its engine: ");
            name = in.nextLine();
            System.out.print("Enter the manufacturing year of its engine: ");
            year = Integer.parseInt(in.nextLine());
            System.out.print("Enter the manufacturer's name of its engine: ");
            manufacturer = in.nextLine();

            submarines[i] = new Submarine(id, new Engine(name, year, manufacturer));
        }

        // Store submarines to ShipStorage
        store.setSubmarines(submarines);

        // Display submarines
        System.out.println("Displaying the data: ");
        for (Submarine submarine : store.getSubmarines()) {
            System.out.println(submarine);
        }
    }
}

Пример прогона:

Enter the ID of the sumarine: 1
Enter the name of its engine: A
Enter the manufacturing year of its engine: 2010
Enter the manufacturer's name of its engine: X
Enter the ID of the sumarine: 2
Enter the name of its engine: B
Enter the manufacturing year of its engine: 2011
Enter the manufacturer's name of its engine: Y
Enter the ID of the sumarine: 3
Enter the name of its engine: C
Enter the manufacturing year of its engine: 2018
Enter the manufacturer's name of its engine: Z
Displaying the data: 
Submarine [id=1, engine=Engine [name=A, year=2010, manufacturer=X]]
Submarine [id=2, engine=Engine [name=B, year=2011, manufacturer=Y]]
Submarine [id=3, engine=Engine [name=C, year=2018, manufacturer=Z]]
0 голосов
/ 14 марта 2020

У вас есть много вариантов сделать это.

  1. Превратить закрытый модификатор в защищенный (если классы находятся в одном пакете) или опубликовать c объекта eng в классе Submarine (сделать то же самое в Класс ShipStorage). Однако, если он игнорирует инкапсуляцию.
  public class Submarine
  {

    public Engine eng;
    public void Submarine ()
    {
      eng = new Engine ();
    }
  }

, тогда используйте store.submarine [index] .engine; заявление.

Создать метод получения, чтобы получить экземпляр движка в классе Submarine. Сделайте то же самое в классе ShipStorage.
  public class Submarine
  {
    private Engine eng;
    public void Submarine ()
    {
      eng = new Engine ();
    }

    public Engine getEngine ()
    {
      return eng;
    }
  }

, затем используйте store.getSubmarineArr () [index] .getEngine (); оператор.

  1. Вы можете добавить ключевое слово publi c stati c перед объявлением переменной (publi c stati c Engine eng;), если хотите получить доступ к переменной без инициализации класса , Однако у вас есть разумная причина использовать ключевое слово stati c. Проверьте использование метода, переменной или класса stati c.

Например;

Engine.eng

или

Engine.getEngine();
0 голосов
/ 14 марта 2020

Добавить геттер на подводную лодку:

public Engine getEngine() {
     return engine;
}

И то же самое в ShipStorage:

public Submarine getSubmarine() {
     return submarine;
}

Затем использовать их обоих в User:

Engine = store.getSubmarine().getEngine();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...