В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Клон () метод возвращает новый массив (мелкая копия) объект, содержащий все элементы в исходном массиве. CopyTo () метод копирует элементы в другой существующий массив. Оба выполняют мелкую копию. Мелкая копия означает, что содержание (каждый элемент массива) содержит ссылки на тот же объект как элементы в исходном массиве. Глубокая копия (который не выполняет ни один из этих методов) создала бы новый экземпляр объекта каждого элемента, приводящего к различному, все же одинаковому объекту.
Так различие:
1- CopyTo require to have a destination array when Clone return a new array.
2- CopyTo let you specify an index (if required) to the destination array.
Редактирование: Удаляют неправильный пример.
Еще одно различие, не упомянутое до сих пор, - то, что
Clone()
целевой массив еще не должен существовать, так как новый создается с нуля. CopyTo()
не только делает целевой массив, должен уже существовать, это должно быть достаточно большим для содержания всех элементов в исходном массиве от индекса, который Вы определяете как место назначения. Оба выполняют мелкие копии, как @PatrickDesjardins сказал (несмотря на многие введенные в заблуждение души, которые думают, что CopyTo
делает глубокую копию).
Однако CopyTo
позволяет Вам копировать один массив в указанный индекс в целевом массиве, давая ему значительно больше гибкости.
object[] myarray = new object[] { "one", 2, "three", 4, "really big number", 2324573984927361 };
//create shallow copy by CopyTo
//You have to instantiate your new array first
object[] myarray2 = new object[myarray.Length];
//but then you can specify how many members of original array you would like to copy
myarray.CopyTo(myarray2, 0);
//create shallow copy by Clone
object[] myarray1;
//here you don't need to instantiate array,
//but all elements of the original array will be copied
myarray1 = myarray.Clone() as object[];
//if not sure that we create a shalow copy lets test it
myarray[0] = 0;
Console.WriteLine(myarray[0]);// print 0
Console.WriteLine(myarray1[0]);//print "one"
Console.WriteLine(myarray2[0]);//print "one"
клон ()
используется для копирования только структуры данных / массива, которые он не копирует фактические данные.
copyto ()
копирует структуру, а также фактические данные.