Java: процесс создания и инициализации объектов
1. Типы данных на Java
В Java есть 3 типа данных: основные типы данных (в Java, Boolean, Byte, Short, Int, Long, Char, Float и Double являются основными типами данных), тип ссылки и нулевой тип. Среди них тип ссылки включает тип класса (включая массив) и тип интерфейса.
Следующее утверждение заявляет о некоторых переменных:
int k; a; // a - это имя переменной объекта типа данных. B B1, B2,…, B10000; // Предположим, что B является абстрактным классом или интерфейсом. Строка S;
Примечание. С точки зрения типов данных и переменных, основные переменные типа данных k, переменные типа класса A и S, абстрактный класс или переменная типа интерфейса B (10000), все являются переменными (идентификаторы).
2. О ручке
Чтобы различить идентификаторы переменных типов эталонных типов и идентификаторов переменных основных типов данных, мы специфически используем ручку для названия идентификаторов переменных переменных эталонных типов. В приведенном выше примере от B1 до B10000, A и S все являются ручкой. Интуитивно смотрите на ручку и ручку. Мы используем широко используемый китайский перевод «ручки» в компьютерном мире.
2.1. Windows использует различные ручки для идентификации, такие как экземпляры приложений, Windows, элементы управления, растровые карты, объекты GDI и т. Д.
Из приведенного выше определения мы видим, что ручка является идентификатором, который используется для идентификации объекта или проекта. Это как наше имя. У каждого будет один. У разных людей разные имена, но может быть также кто -то с тем же именем, что и вы. Из типа данных это всего лишь 16-битное целое число без знака. Приложение почти всегда получает ручку, вызывая функцию Windows, которая затем может использоваться другими функциями Windows для ссылки на соответствующий объект.
Если вы хотите узнать ручки более тщательно, я могу сказать вам, что ручки являются указателями к указателям. Мы знаем, что так называемый указатель является адресом памяти. После начала приложения объекты, которые составляют программу, находятся в памяти. Если мы просто поймем это, кажется, что до тех пор, пока мы знаем первый адрес этой памяти, мы можем использовать этот адрес для доступа к объекту в любое время. Но если вы действительно так думаете, вы очень не правы. Мы знаем, что Windows-это операционная система на основе виртуальной памяти. В этой системной среде диспетчер памяти Windows часто перемещает объекты в памяти, чтобы удовлетворить потребности в памяти различных приложений. Объект объект означает, что его адрес изменился. Если адрес всегда меняется, где мы должны найти объект?
Чтобы решить эту проблему, операционная система Windows освобождает некоторые внутренние адреса хранения для каждого приложения, чтобы специально зарегистрировать изменения адреса каждого объекта приложения в памяти, и этот адрес (местоположение блока хранения) остается неизменным. После перемещения местоположения объекта в памяти, диспетчер памяти Windows сообщает новый адрес объекта, чтобы сохранить его. Таким образом, нам нужно только помнить, что этот адрес ручки, чтобы косвенно знать, где объект находится в памяти. Этот адрес назначен системой, когда объект загружается (нагрузка), и выпускается в систему при разгрузке системы.
Обработка адреса (стабильная) → Запишите адрес объекта в памяти
2.2. Мы можем сказать, что ручка - это термин, который нам очень нужен при изучении Java. Его значение состоит в том, чтобы отличить «объект самого» от переменных объекта (или строгость: идентификаторы переменных типа данных, к которому принадлежит объект).
2.3 Вернитесь к объявлению переменной в 1:
Теперь у вас должно быть четкое представление о комментариях ниже.
int k, j; // k хранит целочисленный номер. А; // Адрес хранится в. B b1, b2,…, b10000; // b1,…, b10000 хранит адрес внутри. Строка S; // s хранит адрес.
3. Об ссылке
Что такое «цитата»? «Идентификатор, которым вы манипулируете, на самом деле является« ссылкой »на объект». (Думая на Java 2e)
Перевод: идентификатор, который вы манипулируете, на самом деле «ссылка» на объект. Или, чтобы быть более точным, переведено в: идентификатор, которым вы управляете, на самом деле является «ссылкой» на объект. Очевидно, что ссылка в исходном тексте - это нечто с чувством направления.
Вернитесь на Java и обратитесь к идентификационному номеру объекта, идентификатору объекта или номеру мобильного телефона объекта. Конечно, больше поговорки состоит в том, что ссылка - это номер комнаты, где объект живет в памяти. Интуитивно говоря, ссылка на объект является возвращающим значением при создании объекта! Ссылка - это возвратное значение нового выражения.
новый a (); Вот объект, но мы не используем ручку для удержания (удержание, удержание, сохранение) ссылки. С микроскопической точки зрения новое выражение завершает задачу инициализации объекта (три шага, подробный анализ ниже) и в целом, оно возвращает ссылку.
Вернитесь к объявлению переменной в 1 снова и посмотрите на комментарии ниже.
А; // объявить ручку a, но не инициализировано, поэтому значение внутри равна нулю. B b1, b2,…, b10000; // объявить ручки B1,…, B10000, но не инициализированы, поэтому значение внутри равна нулю. Строка S; // Объявление ручки, но не инициализировано, поэтому значение внутри равна нулю.
4. Взаимосвязь между ручкой и ссылкой
A a; // объявить ручку a, значение - nulla = new a (); // инициализация дескриптора (handle = reference; то есть назначить ссылку на ручку)
Цитата: значение нового a (). Ссылки можно просто рассматривать как адрес, в котором объект занимает пространство памяти; Благодаря ссылкам на объекты, их можно удобно отличать от других объектов, а ссылки являются уникальной идентичностью объекта.
После того, как ручка инициализирована, вы можете использовать ручку для удаленного управления объектом.
Конечно, это просто для того, чтобы объяснить создание и инициализацию объектов из одного аспекта. После понимания взаимосвязи между ручками и ссылками весь процесс инициализации объекта анализируется ниже. Давайте сначала сделаем следующие приготовления, поговорим о стеке и стеке.
5. Stack and Heap в Java
В Java память разделена на два типа: «стек» и «куча» (стек и куча). Основной тип данных сохраняется в «стеке», а тип ссылки на объект фактически хранится в «куче», а значение адреса контрольной памяти сохраняется только в стеке.
Кстати, давайте поговорим о методах "==" и "Equals ()", чтобы помочь понять концепцию обоих (стека и куча).
При сравнении переменных с «==» в Java система использует значение, хранящееся в переменной в стеке в качестве основы для сравнения. Значение, хранящееся в основном типе данных в стеке, является его значением сдерживания, а значение, хранящееся в типе эталонного типа в стеке, является значением адреса самого объекта, на которое указывает. Класс объектов в пакете java.lang имеет метод публичного логического равенства (Object obj). Он сравнивает, равны ли два объекта. Метод equals () объекта возвращает истину, только если две ссылки, сравниваемые, указывают на один и тот же объект (ручки равны). (Что касается метода equals () класса строки, он переопределяет метод equals () и не обсуждается в этой статье.)
6. Процесс создания и инициализации объекта
В Java объект является экземпляром класса. В целом, когда экземпляр класса, все члены такого класса, включая переменные и методы, копируются в новый экземпляр этого типа данных. Проанализируйте следующие два кода.
6.1 Транспортный автомобиль = новый автомобиль ();
Приведенное выше утверждение делает следующее:
① «Новый автомобиль» справа использует класс автомобиля в качестве шаблона для создания объекта класса транспортных средств (также называемый объектом транспортного средства) в пространстве кучи.
② Конец () означает, что после создания объекта конструктор класса транспортных средств называется немедленно для инициализации недавно сгенерированного объекта. Там должен быть конструктор. Если не создано, Java добавит конструктор по умолчанию.
③ «Транспортное средство» слева создает эталонную переменную класса транспортного средства.
④ Оператор "=" делает точку эталона объекта на только что созданный объект автомобиля. (Напомним, ручки и ссылки)
Разделите вышеуказанное утверждение на два шага:
Транспортный автомобиль; VEH1 = новый автомобиль ();
Писать так яснее. Есть две сущности: одна является эталонной переменной объекта, а другой - сам объект. Сущности, созданные в пространстве кучи, отличаются от тех, которые создаются в пространстве стека. Хотя они являются сущностями, которые существуют, кажется трудно точно «поймать». Давайте внимательно изучим второе предложение и выясним, как название объекта, который вы только что создали? Некоторые люди говорят, что это называется «автомобиль». Нет, «транспортное средство» - это название класса (шаблон создания для объекта). Класс транспортных средств может создавать бесчисленные объекты на основе этого, и эти объекты нельзя назвать «транспортным средством». У объекта даже нет имени, поэтому к нему нельзя получить напрямую. Мы можем получить доступ к объектам косвенно через ссылки на объекты.
6.2 Транспортный автомобиль2;
VEH2 = VEH1;
Поскольку VEH1 и VEH2 являются просто ссылками на объекты, вторая строка делает просто присвоение ссылки (адрес) от VEH1 на VEH2, так что VEH1 и VEH2 указывают на уникальный объект транспортного средства одновременно.
6.3 VEH2 = новый автомобиль ();
Вместо этого эталонная переменная VEH2 указывает на второй объект.
Выведенный из приведенного выше оператора, мы можем сделать следующий вывод: ① Ссылка на объект может указывать на объект 0 или 1; ② Объект может иметь N ссылки на это.
Java: преобразование типа данных
1. Простые типы Java и их классы инкапсуляции
1.1 Ява простые типы и классы инкапсуляции. Конечно, когда Java предоставляет большое количество других классов, она также предоставляет инкапсулированные классы, соответствующие простым типам данных. Следовательно, Java имеет разные типы данных, такие как Int и Integer (Float и Float, Double и Double ...).
Существует две основные категории типов данных на языке Java: один - простой тип, также известный как основной тип (примитив), а другой - это ссылочный тип (ссылка). Простая переменная типа хранит определенное значение, в то время как переменная эталонного типа хранит ссылку на объект.
Java определяет размер каждого простого типа. Эти размеры не меняются с изменениями в структуре машины. Этот размер инвариант, что является одной из причин, по которой программы Java имеют сильную переносимость.
В следующей таблице перечислены простые типы, занятость бинарных битов и соответствующие классы инкапсулятора, определенные в Java.
Простые типы в таблице Java
1.2 Зачем использовать классы инкапсуляции. Возьмите Int и Integer в качестве примера. Хотя они по сути представляют 32-разрядное целое число, они являются разными типами данных. Фактически, целые числа, непосредственно используемые в Java, являются int (что касается Int и Integer). Только когда данные должны отображаться в качестве идентификации объекта, целочисленное значение должно быть инкапсулировано в объект с помощью инкапсулятора, соответствующий int.
Например: чтобы добавить целое число к вектору в пакете java.util, целое число должно быть инкапсулировано в целочисленном экземпляре следующим образом:
Vector v = new Vector (); int k = 121; V.Addelemt (новое целое число (k));
Кроме того, Integer, как класс инкапсулятора, соответствующий INT, предоставляет много методов, таких как целочисленные методы строительства, методы целочисленного преобразования в другие численные типы и т. Д., Которые недоступны в данных типа Int.
2. Константы на Java
Нам нужно обратить внимание на следующие типы констант.
2.1 Когда шестнадцатеричная целочисленная константа выражается в шестнадцатеричной, они должны начинать с 0x или 0x, например, 0xff, 0x9a.
2.2 Octal Integer Constant Octal должен начинаться с 0, например, 0123, 034.
2.3 длинного типа длинного типа должен закончиться L, например, 9L, 342L.
2.4 Постоянные постоянные плавания, так как тип по умолчанию десятичной константы является двойным типом, f (f) должен быть добавлен после типа поплавки. Переменные с десятичными декорациями также имеют двойной тип по умолчанию.
float f;
F = 1,3F; // F должен быть объявлен.
2.5 Константы символов константы символов должны быть заключены в две отдельные кавычки (обратите внимание, что строковые константы заключены в две двойные кавычки). Персонажи в Java объясняют два байта.
Некоторые часто используемые экологичные символы.
①/r означает принятие ввода клавиатуры, что эквивалентно нажатию клавиши Enter;
②/n означает новую линию;
③/T представляет символ вкладки, который эквивалентен клавишу таблицы;
④/B представляет ключ Backspace, которая эквивалентна ключу задних пространств;
⑤/'означает отдельные кавычки;
⑥/'' означает двойные цитаты;
⑦ // означает черту/.
3. Преобразование между простыми типами данных
Существует два способа преобразования между простыми типами данных: автоматическое преобразование и преобразование листа, которые обычно случаются при передаче параметров выражения или метода.
3.1 Автоматическое преобразование конкретно, когда «небольшие» данные рассчитываются вместе с «большими» данными, система автоматически преобразует «небольшие» данные в «большие» данные, а затем выполнит расчет. При вызове метода фактические параметры являются «малыми», а формальные данные параметров метода вызываемого - «большой» (если есть совпадение, конечно, метод сопоставления будет вызоваться непосредственно), система автоматически преобразует «небольшие» данные в «большие» данные, а затем вызовет метод. Естественно, для нескольких перегруженных методов того же имени он будет преобразован в данные «закрыть» и вызван.
Эти типы от «маленького» до «больших»-это (байт, короткий, чар)-Int-Long-Float-Double. То, о чем мы говорим здесь, относится не к количеству занятых байтов, а к размеру диапазона, представляющего значение.
Пожалуйста, смотрите следующий пример:
① Следующие утверждения могут быть переданы непосредственно в Java:
байт B; int i = b; long l = b; float f = b; double d = b;
② Если тип низкого уровня является типом CHAR, он будет преобразован в соответствующее значение кода ASCII при преобразовании в тип высокого уровня (интегральный тип), например, например,
char c = 'c'; int i = c; System.out.println ("output:"+i);
Выход:
Вывод: 99;
③ Для трех типов байта, коротких и чар они горизонтальны, поэтому они не могут автоматически конвертировать друг друга. Можно использовать следующее преобразование типа актера.
короткий i = 99; char c = (char) i; system.out.println ("output:"+c);Выход:
Вывод: C;
④ Если есть метод в полиморфизме объекта:
f (byte x) {…}; f (short x) {…}; f (int x) {…}; f (long x) {…}; f (float x) {…}; f (двойной x) {…}; f (двойной x) {…}; Есть также: char y = 'a'; Итак, какой метод вызовет оператор F (y)? Ответ: F (int x) {...} Метод, потому что его формальный эталонный параметр «большой» и является «самым близким».
И для метода:
f (float x) {…}; f (двойной x) {…}; Существует также: Long Y = 123L; Затем метод, вызванный оператором f (y), является f (float x) {…}.
3.2. При преобразовании «больших» данных в «небольшие» данные вы можете использовать кастинг. То есть вы должны использовать следующий формат операторов:
int n = (int) 3.14159/2;
Как вы можете себе представить, это преобразование, безусловно, может привести к переполнению или снижению точности.
3.3 Автоматически улучшать тип данных выражения. Что касается автоматического улучшения типа, обратите внимание на следующие правила.
① Все значения типов байтовых, коротких и символов будут способствовать типу INT;
② Если есть операнд, который длинный, результат расчета длинный;
③ Если существует операнд, который является типом плавания, результатом расчета является тип Float;
④ Если есть операнд, который является двойным типом, результат расчета двойной тип;
пример,
байт B; b = 3; b = (байт) (b*3); // байт должен быть объявлен.
3.4 Преобразование типа перехода Для класса упаковки вообще говоря, мы сначала объявляем переменную, а затем генерируем соответствующий класс упаковки, и мы можем использовать различные методы класса упаковки для выполнения преобразования типа. Например:
① Когда вы хотите преобразовать Float в двойной тип:
float f1 = 100,00F; Float f1 = новый поплавок (F1); Double d1 = f1.doublevalue (); // f1.doublevalue () - метод возврата двойного значения типа класса Float
② Когда вы хотите преобразовать двойной тип в тип int:
Double D1 = 100,00; двойной d1 = новый двойной (D1); int i1 = d1.intvalue ();
Преобразуйте переменные простых типов в соответствующий класс обертки, и можно использовать конструктор класса обертки. То есть: логическое (логическое значение), символ (значение char), целое число (int value), long (long value), float (значение float), двойное (двойное значение)
В каждом классе упаковки всегда есть метод × value () для получения соответствующих данных простых типов. Используя этот метод, также может быть реализовано преобразование между различными численными переменными. Например, для класса реального типа с двойной задачей Intvalue () может получить соответствующую целочисленную переменную, а DoubleValue () может получить соответствующую переменную реального типа с двойным определением.
4. Преобразование между строками и другими типами
4.1 Преобразование других типов в строки ① Вызовите метод преобразования строки класса: x.toString ();
②automatic преобразование: x+";
③ Методы с использованием строки: string.volueof (x);
4.2. Преобразовать строку в другие типы в качестве значений ① Сначала преобразовать ее в соответствующий экземпляр обертки, а затем вызовите соответствующий метод, чтобы преобразовать ее в другие типы. Например, формат преобразования двойного типа значения «32.1» в символе: New Float ("32.1"). DoubleValue (). Вы также можете использовать: double.valueof ("32.1"). DoubleValue ()
② Статический метод Parsexxx
String S = "1"; Byte b = byte.parsebyte (s); short t = short.parseshort (s); int i = integer.parseint (s); long l = long.parselong (s); float f = float.parsefloat (s); double d = double.parsedouble (ы);
③ Метод GetNumericValue (char) персонажа может быть найден в API.
5. Преобразование класса даты и другие типы данных
Не существует прямой переписки между целыми и датскими классами, но вы можете использовать тип Int для представления года, месяца, дня, часа, минуты и секунд соответственно, так что между ними устанавливается корреспонденция. При выполнении этого преобразования вы можете использовать три формы конструктора класса даты:
①date (int Year, int Month, Date Date): INT тип представляет собой год, месяц и день (INT Year, INT MONTAL, DATE, INT HRS, INT MIN): INT тип представляет собой год, месяц, день, час и минутный Занятия, то есть время выражается как количество миллисекундов с 0:00:00, по Гринвичу 1 января 1970 года. Для этой переписки класс даты также имеет соответствующий конструктор: дата (долгое дата).
Получите год, месяц, день, час, минуту, вторую и неделю в классе даты. Вы можете использовать getyear (), getMonth (), getDate (), gethours (), getMinutes (), getSeconds (), getDay (), и вы также можете понимать его как преобразование класса даты в int.
Метод GETTIME () класса даты может получить длительный целый ряд, соответствующий времени, которое мы упоминали ранее. Как и класс обертки, класс даты также имеет метод ToString (), который может преобразовать его в класс строки.
Иногда мы хотим получить определенный формат даты, например, 20020324, мы можем использовать следующий метод, сначала ввести его в начале файла,
Импорт java.text.simpledateformat; import java.util.*; java.util.date date = new java.util.date (); // Если вы хотите получить формат yyyymmdd SimpleDateFormat sy1 = new SimpleDateFormat ("yyyyMmdd"); строка dateformat = sy1.format (date); // Если вы хотите получить год, месяц, день, SimpleDateFormat sy = new SimpleDateFormat ("yyyyy"); SimpleDateFormat sm = new SimpleDateFormat ("MM"); SimpleDateFormat sd = new SimpleDateFormat ("dd"); String syear = sy.format (date); string smon = sm.format (date); string sday = sd.format (date);