Конструктор копирования - это когда ваш класс содержит конструктор, который принимает экземпляр себя в качестве параметра. Параметр используется для создания нового экземпляра класса, который имеет те же значения для своих полей, что и класс экземпляра, предоставленный в качестве параметра.
Ваш класс Node должен иметь конструктор, подобный этому:
public class Node {
public Node(Node n) {
//copy all fields in Node n here
//eg this.a = n.a
//this.b = n.b etc
}
}
Затем, когда вы наследуете от Node, вам нужно также вызвать этот родительский метод в конструкторе дочернего класса:
public class TestClass extends Node {
public TestClass(TestClass t) {
super(t);
//copy any additional fields that is only present in TestClass here
}
}
Теперь разница между мелкой и глубокой копией.
Мелкая копия - это когда ссылка установлена равной другой ссылке.
Например:
Point2D a = new Point2D(50, 50);
Point2D b = a;
Когда вы изменяете значение одного из членов a, также влияет b. Причина в том, что и a, и b являются ссылкой на один и тот же объект.
a.x = 100;
System.out.println(b.x == 100); //prints true
Теперь глубокая копия - это если a и b ссылаются на свои собственные экземпляры. Это можно сделать следующим образом:
Point2D a = new Point2D(50, 50);
Point2D b = new Point2D();
b.x = a.x
b.y = a.y
Если я сейчас наберу:
a.x = 100
тогда b.x не изменится на это же значение, но сохранит предыдущее значение, которое изначально было сохранено в a, в данном случае 50.
System.out.println(b.x == 100); //prints false
System.out.println(b.x == 50); //prints true
Если вы хотите иметь глубокое копирование в своем конструкторе, то вам нужно убедиться, что все члены класса, которые являются ссылками на изменяемые классы, ссылаются на свои собственные экземпляры