Я поставлю это в реальном ответе, поэтому у меня будет больше возможностей для работы.
Проблема здесь в вашем Line
конструкторе. Вы сталкиваетесь с чем-то, что называется «затенение переменных».
public Line(Point p1, Point p2) {
p1 = new Point(p1.getX(), p1.getY());
p2 = new Point(p2.getX(), p2.getY());
}
Вы передаете переменные в этот конструктор с именами p1
и p2
:
public Line(Point p1, Point p2) // Here are p1 and p2 being passed into the constructor
Теперь вы также имеют p1
и p2
, определенные на уровне класса, например:
private Point p1;
private Point p2;
Что вы хотите сделать, это создать новые очки на основе p1
и p2
передаются в конструктор и сохраняют эти новые точки в этих переменных уровня класса.
Но поскольку конструктор имеет локальные переменные с тем же именем, что и переменные уровня класса, локальные переменные имеют приоритет, и " скрыть "переменные уровня класса. Это известно как «затенение».
Так что в конструкторе, когда вы хотите получить доступ к этим переменным уровня класса, вы должны ссылаться на них как this.p1
и this.p2
, так как p1
и p2
см. Параметры конструктора.
public Line(Point p1, Point p2) {
p1; // <-- This is the p1 being passed into the constructor
this.p1; // <-- This is the class-level variable with the same name
}
Когда вы используете this.
для получения правильных переменных, код должен выглядеть следующим образом:
public Line(Point p1, Point p2) {
this.p1 = new Point(p1.getX(), p1.getY());
this.p2 = new Point(p2.getX(), p2.getY());
}
Краткий визуальный справочник:
private Point p1; // <------------------+
private Point p2; // |
// |
// +--------------- + |
// | | |
// v | |
public Line(Point p1, Point p2) {
// | |
p1; // <--these are the same---+ |
this.p1; // <--these are the same---+
}