В этой статье анализируется вызов по значению в Java с примерами. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Java управляет экземплярами объектов по ссылке
Что можно подтвердить, так это то, что способ управления объектами в Java заключается в управлении объектами по ссылке. Чтобы понять это более глубоко, я написал следующий код:
Сначала определите собственный тип. Скопируйте код. Код выглядит следующим образом: public class Person {.
Строковое имя;
Человек (строковое имя) {
это.имя = имя;
}
}
По умолчанию здесь используется имя public (которое отличается от атрибута класса по умолчанию в C++).
Тогда вызов функции Main будет выглядеть следующим образом:
Скопируйте код следующим образом: public class Main {
/**
* @param аргументы
*/
public static void main(String[] args) {
// TODO Автоматически сгенерированная заглушка метода
Человек p1 = новый Человек («Пол»);
Человек p2 = новый Человек («Горе»);
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
Человек тмп;
ТМП = р1;
р1 = р2;
System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name);
}
}
Результат на данный момент следующий:
Скопируйте код следующим образом: p1.имя = Пол p2.имя = Грифен
tmp.name = Пол p1.name = Горе p2.name = Горе
Хм? Почему это результат? Как CPPer, я в замешательстве! Это ссылка, поэтому после выполнения следующего оператора скопируйте код следующим образом: Person tmp;
ТМП = р1;
р1 = р2;
Поскольку я понимаю эту операцию в соответствии с концепцией ссылки в C++, то все tmp p1 и p2 в этот момент должны быть одним и тем же объектом, то есть все они должны указывать на объект p2. Но результаты ясно доказывают, что это понимание ошибочно! Итак, поскольку ссылки в Java — это не то же самое, что ссылки в C++? ! ! ! Это то же самое, что указатель в C++?
хороший! Давайте разберемся в этом процессе операции с помощью указателей в C++.
Прежде всего, Person tmp объявляет указатель, который аналогичен объявлению указателя в C++; В C++ четко оговорено, что объявление ссылки не может быть записано таким образом отдельно. Когда объявление ссылки делается, оно должно указывать на объект. Очевидно, рассуждения на первом этапе верны. Это хорошее начало! Тогда tmp = p1; p1 = p2; Очевидно, tmp указывает на p1, а p1 указывает на p2. Оказалось, что это соответствует!
Это означает, что если ссылки в Java сравнивать с операциями с данными в C++, они должны быть более похожи на концепцию указателей в C++!
Указатели в C++ реализуют вышеуказанные функции.
Поскольку описанный выше метод работы с объектами в Java аналогичен указателю в C++, давайте посмотрим, как реализовать описанный выше метод в C++. Скопируйте код следующим образом: #include "stdafx.h"
#include <строка>
#include <iostream>
класс Человек
{
публика:
std::имя строки;
публика:
Человек(std::имя строки)
{
это->имя = имя;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Человек* p1 = новый Человек("Пол");
Человек* p2 = новый Человек("Горе");
std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
Человек* тмп;
ТМП = р1;
р1 = р2;
std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl ;
удалить ТМП;
удалить р1;
вернуть 0;
}
После отладки я обнаружил, что результат вывода такой же, как и приведенный выше результат запуска Java.
Базовая реализация любого языка одинакова
Поскольку эффект ссылки в Java аналогичен указателю в C++, почему в Java он не называется указателем? Очевидно, что есть различия. Например, ссылки в Java не могут выполнять операции ++, но указатели в C++ могут и могут перемещаться по своему желанию. Очевидно, что на данный момент Java проделала большую работу над своими указателями, чтобы ограничить их и сделать их работу более безопасной. Но каким бы большим ни казался верхний уровень, когда вы доберетесь до нижнего слоя, вам нужно подать заявку на память, и память должна быть освобождена после того, как она будет израсходована. Это работа на любом языке!
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.