Перейти к содержимому

Java lang что это

  • автор:

Java. Lang Пространство имен

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Классы

Возникает, когда приложение пытается вызвать абстрактный метод.

Изменяемая последовательность символов.

Возникает при возникновении исключительного арифметического условия.

Создается, чтобы указать, что к массиву был предоставлен доступ с недопустимым индексом.

Создается для указания того, что предпринята попытка сохранить неправильный тип объекта в массиве объектов.

Возникает, чтобы указать, что утверждение завершилось сбоем.

Логический класс заключает значение примитивного типа boolean в объект .

Вызывается для указания того, что invokedynamic инструкции или динамической константы не удалось разрешить метод начальной загрузки и аргументы, или для invokedynamic инструкции методу начальной загрузки не удалось предоставить java.

Класс Byte заключает значение примитивного типа byte в объект .

Класс Character заключает в оболочку значение примитивного типа char в объекте .

Экземпляры этого класса представляют определенные подмножества набора символов Юникода.

Семейство подмножеств символов, представляющих блоки символов в спецификации Юникода.

Экземпляры класса Class представляют классы и интерфейсы в работающем приложении Java.

Вызывается для указания того, что код попытался привести объект к подклассу, экземпляром которого он не является.

Возникает, когда виртуальная машина Java обнаруживает цикличность в иерархии суперкласса загружаемого класса.

Возникает, когда виртуальная машина Java пытается прочитать файл класса и определяет, что файл имеет неправильный формат или иным образом не может быть интерпретирован как файл класса.

Загрузчик классов — это объект, отвечающий за загрузку классов.

    Метод forName в классе Class .

Вызывается для указания того clone , что метод в классе Object был вызван для клонирования объекта, но класс объекта не реализует Cloneable интерфейс .

Ничего не делает в Android.

Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.

Класс Double заключает в оболочку значение примитивного типа double в объекте .

Это общий базовый класс всех типов перечислений языка Java.

Возникает, когда приложение пытается получить доступ к константе перечисления по имени, а тип перечисления не содержит константы с указанным именем.

Является Error подклассом , Throwable который указывает на серьезные проблемы, которые разумное приложение не должно пытаться перехватывать.

Класс Exception и его подклассы являются формой Throwable , которая указывает условия, которые может захотеть перехватывать разумное приложение.

Сигнализирует о том, что в статичном инициализаторе произошло непредвиденное исключение.

Класс Float заключает значение примитивного типа float в объект .

Возникает, если приложение пытается получить доступ к полю или изменить его или вызвать метод, к которому у него нет доступа.

Исключение IllegalAccessException возникает, когда приложение пытается отражательно создать экземпляр (отличный от массива), задать или получить поле или вызвать метод, но выполняющийся в данный момент метод не имеет доступа к определению указанного класса, поля, метода или конструктора.

Создается для указания того, что методу передан недопустимый или недопустимый аргумент.

Вызывается для указания того, что поток пытался дождаться монитора объекта или уведомлять другие потоки, ожидающие монитор объекта, не имея указанного монитора.

Сигнализирует о том, что метод был вызван в незаконное или неподходящее время.

Создается для указания того, что поток не находится в соответствующем состоянии для запрошенной операции.

Возникает, когда в определении класса произошло несовместимое изменение класса.

Создается для указания того, что индекс какого-либо типа (например, массив, строка или вектор) выходит за пределы диапазона.

Этот класс предоставляет ThreadLocal наследование значений от родительского потока к дочернему потоку: при создании дочернего потока дочерний элемент получает начальные значения для всех наследуемых локальных переменных потока, для которых родительский поток имеет значения.

Возникает, когда приложение пытается использовать конструкцию Java new для создания экземпляра абстрактного класса или интерфейса.

Возникает, когда приложение пытается создать экземпляр класса с помощью newInstance метода в классе Class , но экземпляр указанного объекта класса невозможно создать.

Класс Integer заключает в оболочку значение примитивного типа int в объекте .

Возникает, чтобы указать, что на виртуальной машине Java произошла непредвиденная внутренняя ошибка.

Возникает, когда поток находится в состоянии ожидания, находится в спящем режиме или иным образом занят, а поток прерывается либо до, либо во время действия.

Класс System содержит несколько полезных полей и методов класса.

Подклассы LinkageError указывают на то, что класс имеет некоторую зависимость от другого класса, однако последний класс несовершенно изменился после компиляции первого класса.

Класс Long заключает в оболочку значение примитивного типа long в объекте .

Класс Math содержит методы для выполнения базовых числовых операций, таких как элементарные экспоненциальные, логарифмовые, квадратные корневые и тригонометрические функции.

Возникает, если приложение пытается создать массив с отрицательным размером.

Возникает, если виртуальная машина Java или ClassLoader экземпляр пытается загрузиться в определение класса (в рамках обычного вызова метода или при создании нового экземпляра с помощью new выражения) и определение класса не найдено.

Возникает, если приложение пытается получить доступ к указанному полю объекта или изменить его, а этот объект больше не имеет этого поля.

Сигнализирует о том, что у класса нет поля с указанным именем.

Возникает, если приложение пытается вызвать указанный метод класса (статический или экземпляр), и этот класс больше не имеет определения этого метода.

Возникает, когда не удается найти определенный метод.

Возникает, когда приложение пытается использовать null в случае, когда требуется объект .

Абстрактный класс Number — это надкласс платформенных классов, представляющих числовые значения, которые можно преобразовать в примитивные типы byte , double , float , int , long и short .

Создается для указания того, что приложение попыталось преобразовать строку в один из числовых типов, но строка не имеет соответствующего формата.

Класс Object является корнем иерархии классов.

Возникает, когда виртуальной машине Java не удается выделить объект из-за нехватки памяти, а сборщик мусора не может сделать его доступным.

Указывает, что объявление метода предназначено для переопределения объявления метода в супертипе.

Package объекты содержат сведения о версии о реализации и спецификации пакета Java.

И ProcessBuilder#start() Runtime#exec(String[],String[],File) Runtime.exec методы создают собственный процесс и возвращают экземпляр подкласса Process , который можно использовать для управления процессом и получения сведений о нем.

Этот класс используется для создания процессов операционной системы.

Представляет источник входных данных подпроцесса или назначение выходных данных подпроцесса.

Общий суперкласс исключений, создаваемых отражающими операциями в отражении ядра.

Каждое приложение Java имеет один экземпляр класса Runtime , который позволяет приложению выполнять интерфейс со средой, в которой выполняется приложение.

RuntimeException — это суперкласс тех исключений, которые могут возникать во время нормальной работы виртуальной машины Java.

Устаревший код безопасности; не использовать.

Создается диспетчером безопасности для указания нарушения безопасности.

Устаревший код безопасности; не использовать.

Класс Short заключает значение примитивного типа short в объект .

Возникает при переполнении стека из-за того, что приложение слишком глубоко повторяется.

Элемент трассировки стека, возвращаемый . Throwable#getStackTrace()

Класс StrictMath содержит методы для выполнения базовых числовых операций, таких как элементарные экспоненциальные, логарифмовые, квадратные корневые и тригонометрические функции.

Класс String представляет символьные строки.

Потокобезопасная, изменяемая последовательность символов.

Изменяемая последовательность символов.

Создается методами String для указания того, что индекс либо отрицательный, либо больше размера строки.

Указывает, что предупреждения именованного компилятора должны подавляться в аннотированном элементе (и во всех программных элементах, содержащихся в элементе с заметками).

Поток — это поток выполнения в программе.

Экземпляр ThreadDeath создается в потоке жертвы при вызове метода (не рекомендуется Thread#stop() ).

Группа потоков представляет набор потоков.

Этот класс предоставляет локальные переменные потока.

Класс Throwable является суперклассом всех ошибок и исключений в языке Java.

Возникает, когда приложение пытается получить доступ к типу с помощью строки, представляющей имя типа, но определение типа с указанным именем не найдено.

Возникает при возникновении неизвестного, но серьезного исключения на виртуальной машине Java.

Возникает, если виртуальной машине Java не удается найти соответствующее определение на собственном языке метода, объявленного native .

Возникает, когда виртуальная машина Java пытается прочитать файл класса и определяет, что номера основной и дополнительной версий в файле не поддерживаются.

Создается для указания того, что запрошенная операция не поддерживается.

Возникает, когда средство проверки обнаруживает, что файл класса, хотя и имеет правильный формат, содержит некоторую внутреннюю несогласованность или проблему безопасности.

Возникает, чтобы указать, что виртуальная машина Java не работает или у нее нет ресурсов, необходимых для продолжения работы.

Класс Void является классом заполнителя, который содержит ссылку на Class объект, представляющий ключевое слово Java void.

Интерфейсы

Объект , к которому char можно добавить последовательности и значения.

Объект, который может хранить ресурсы (например, дескрипторы файлов или сокетов), пока не будет закрыт.

— CharSequence это удобочитаемая последовательность значений char .

Класс реализует Cloneable интерфейс, указывающий методу java.lang.Object#clone() , что для этого метода разрешено создавать копию экземпляров этого класса по полю.

Этот интерфейс накладывает общий порядок на объекты каждого класса, реализующего его.

Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.

Информативный тип заметки, используемый для указания того, что объявление типа интерфейса предназначено для функционального интерфейса в соответствии со спецификацией языка Java.

Реализация этого интерфейса позволяет объекту быть целевым объектом расширенной for инструкции (иногда называемой оператором for-each loop).

Указывает, что объявление метода предназначено для переопределения объявления метода в супертипе.

— Readable это источник символов.

Интерфейс Runnable должен быть реализован любым классом, экземпляры которого предназначены для выполнения потоком.

Утверждение программиста о том, что тело аннотированного метода или конструктора не выполняет потенциально небезопасные операции с параметром varargs.

Указывает, что предупреждения именованного компилятора должны подавляться в аннотированном элементе (и во всех программных элементах, содержащихся в элементе с заметками).

Интерфейс для обработчиков, вызываемых при внезапном Thread завершении из-за неперехваченного исключения.

Java.lang: что это такое и зачем он нужен?

«java.lang» — это пакет (package) в языке программирования Java. В Java пакеты используются для организации классов и интерфейсов в иерархической структуре. Пакет java.lang является одним из самых базовых и важных пакетов в Java, и большинство классов из этого пакета автоматически импортируются в любой Java-программе без явного указания.

В java.lang содержатся основные классы и интерфейсы, которые необходимы для работы любой Java-программы. Некоторые из самых известных классов и интерфейсов из этого пакета включают:

  • Object: Все классы в Java являются подклассами класса Object, который предоставляет основные методы, такие как equals(), hashCode(), toString() и другие.
  • String: Класс String используется для работы со строками и является неизменяемым (immutable).
  • Integer, Double, Boolean, и другие классы-обертки для примитивных типов данных.
  • Math: Класс Math предоставляет статические методы для выполнения математических операций.
  • Thread: Класс Thread используется для создания и управления потоками выполнения.
  • RuntimeException и другие исключения и исключительные ситуации.
  • ClassLoader: Класс ClassLoader позволяет динамически загружать классы в программу.
  • System: Класс System предоставляет доступ к системным ресурсам, таким как стандартный ввод, стандартный вывод и системные свойства.

Пакет java.lang импортируется по умолчанию, поэтому вы можете использовать классы и интерфейсы из этого пакета без явного импорта. Это делает его одним из самых доступных и важных пакетов в языке Java.

Если вы хотите стать крутым Java-разработчиком, советуем начать обучение на курсах в онлайн-школах. 5 курсов Java-разработки, на которые стоит обратить внимание:

  • Курс «Java-разработчик» в онлайн-университете Skypro.
  • Курс «Профессия Java-разработчик» в онлайн-школе Skillbox.
  • Курс «Профессия Java-разработчик с нуля» в онлайн-школе Нетология.
  • Курс «Java-разработчик» в Яндекс Практикуме.
  • Курс «Java-разработчик с нуля до Middle» в онлайн-школе GeekBrains

Если вы хотите рассмотреть больше программ обучения, то можете ознакомиться с нашим обзором 10 онлайн-курсов по Java-разработке. В нём вы узнаете, как получить дополнительные скидки по промокодам на каждый из курсов, благодаря чему вы сможете неплохо сэкономить.

Пакет java.lang . Общие сведения. Обзор классов и интерфейсов

Пакет java.lang является основным пакетом, средства которого используются при разработке программ на языке Java. Пакет содержит наиболее широко используемые интерфейсы и классы, без которых невозможно написать программу на Java.

Этот пакет автоматически импортируется во все программы. Поэтому, чтобы доступиться к средствам пакета, не обязательно включать этот пакет в программу при помощи строки

import java.lang.*;

Пакет включает средства для расширения возможностей примитивных типов данных, составляющих элементов языка, работы со строками, потоками и прочее.

2. Классы пакета java.lang

Пакет java.lang содержит следующие классы:

  • Boolean — класс-обертка (класс-оболочка) для типа boolean ;
  • Byte — класс-обертка для типа byte ;
  • Character — класс-обертка для типа char ;
  • Character.Subset — определяет специфические множества символов набора Unicode;
  • Class — инкапсулирует состояние времени выполнения класса или интерфейса;
  • ClassLoader — определяет объект, отвечающий за порядок загрузки классов;
  • ClassValue — используется для связи значения с типом;
  • Compiler — обеспечивает создание сред в которых байт-код компилируется в исполнительный код;
  • Double — класс-обертка для типа double;
  • Enum — класс, служит суперклассом для всех перечислений ( enum ) в программе;
  • Float — класс-обертка для типа float;
  • InheritableThreadLocal — предназначен для создания локальных переменных потоков выполнения, которые могут наследоваться;
  • Integer — класс-обертка для типа int ;
  • Long — класс-обертка для типа long ;
  • Math — содержит функции и константы для проведения математических вычислений над числовыми типами;
  • Number — абстрактный суперкласс для классов Byte , Short , Integer , Long , Float , Double ;
  • Object — суперкласс для всех классов Java;
  • Package — содержит данные о версии пакета;
  • Process — класс, инкапсулирует процесс. Процессом служит выполняемая программа;
  • ProcessBuilder — обеспечивает один из способов запуска процессов (программ) и управления ими;
  • ProcessBuilder.Redirect — инкапсулирует источник или адресат ввода-вывода, который связан с процессом;
  • Runtime — инкапсулирует среду выполнения;
  • RuntimePermission — обеспечивает механизм защиты в Java;
  • SecurityManager — обеспечивает механизм наследования подклассов для создания диспетчера защиты;
  • Short — класс-обертка над типом short;
  • StackTraceElement — предназначен для описания отдельного элемента трассировки стека;
  • StrictMath — обеспечивает набор методов для проведения математических вычислений повышенной точности;
  • String — класс, содержащий средства для работы с неизменяемыми строками символов;
  • StringBuffer — определяет строку, которая может быть изменена (в отличие от String );
  • StringBuilder — определяет изменяющуюся строку. Объекты типа StringBuilder не являются безопасными при использовании во многих потоках, в этом случае лучше использовать StringBuffer ;
  • System — определяет набор полезных статических методов и переменных;
  • Thread — предназначен для создания нового потока выполнения;
  • ThreadGroup — используется для создания группы потоков выполнения;
  • ThreadLocal — используется для создания локальных переменных потоков выполнения;
  • Throwable — класс который является суперклассом для всех классов исключений;
  • Void — содержит поле, в котором хранится ссылка на объект типа Class для типа void .
3. Интерфейсы пакета java.lang

В пакете java.lang определен ряд ключевых интерфейсов:

  • Appendable — предназначен для реализации методов добавления символов или символьных последовательностей к объектам;
  • AutoCloseable — обеспечивает поддержку оператора try с ресурсами (автоматическое управление ресурсами);
  • CharSequence — определяет методы, дающие доступ только для чтения к последовательностям символов;
  • Cloneable — используется в классах, где нужно выполнить поразрядное копирование объектов (клонирование);
  • Comparable — обеспечивает сравнение объектов классов по некоторому критерию. Используется в методах сортировки (упорядочения) объектов;
  • Iterable — для набора объектов обеспечивает реализацию цикла for в стиле for each ;
  • Readable — обеспечивает использование объекта в качестве источника для чтения символов;
  • Runnable — используется для реализации в классе потока выполнения;
  • Thread.UncaughtExceptionHandler — реализуется классами, в которых нужно обрабатывать необрабатываемые исключения.

Связанные темы

  • Применение классов в программах на Java. Определение класса и объекта класса. Примеры
  • Интерфейсы. Особенности использования. Преимущества применения интерфейсов. Ключевые слова interface , implements . Примеры

Пакет java.lang

Пакет java.lang является наиболее важным из всех пакетов, входящих в Java API, поскольку включает классы, составляющие основу для всех других классов. Каждый класс в Java неявным образом импортирует все классы данного пакета, поэтому данный пакет можно не импортировать.

В этой библиотеке включены

  • Object — базовый класс
  • Class — объект описания класса (поля, методы)
  • Math — набор статических методов для математических вычислений
  • Классы-обёртки для примитивных типов :
    • Integer
    • Character
    • Boolean
    • Void
    • String
    • StringBuffer
    • ClassLoader
    • SecurityManager
    • System
    • Runtime
    • Process
    • Runnable
    • Thread
    • ThreadGroup
    • Error
    • Exception
    • RuntimeException

    Object

    Основу пакета составляет класс Object, который является корневым в иерархии классов. Если при описании класса родитель не указывается, то им считается класс Object. Все объекты, включая массивы, наследуются от этого класса.

    Класс Object включает методы, которые наследуются остальными классами Java.

    Метод Описание
    Object clone() Функция создания нового объекта, копии существующего
    boolean equals(Object object) Функция определения равенства текущего объекта другому
    void finalize() Процедура завершения работы объекта; вызывается перед удалением неиспользуемого объекта
    Class getClass() Функция определения класса объекта во время выполнения
    int hashCode() Функция получения хэш-кода объекта
    void notify() Процедура возобновления выполнения потока, который ожидает вызывающего объекта
    void notifyAll() Процедура возобновления выполнения всех потоков, которые ожидают вызывающего объекта
    String toString() Функция возвращает строку описания объекта
    void wait() Остановка текущего потока до тех пор, пока другой поток не вызовет notify() или notifyAll метод для этого объекта
    void wait(long ms) Остановка текущего потока на время или до тех пор, пока другой поток не вызовет notify() или notifyAll метод для этого объекта
    void wait(long ms, int nano) Остановка текущего потока на время или до тех пор, пока другой поток не вызовет notify() или notifyAll метод для этого объекта

    Методы notify(), notifyAll(), wait() используются для поддержки многопоточности и являются «финальными» (final), т.е. их нельзя переопределять в классах-наследниках. Также нельзя переопределять и метод getClass.

    Метод equals

    Особый интерес представляет метод equals, определяющий, являются ли объекты одинаковыми. В классах — наследниках, этот метод при необходимости может быть переопределен, чтобы отражать действительное равенство объектов. Например, сравнение объектов-оберток целых чисел (класс Integer), должно по всей логике возвращать значение true, если равны значения int чисел, которые обернуты, даже если различаются объектные ссылки на сами объекты класса-обертки Integer.

    Пример использования метода equals

    package example; public class Rectangle < public int sideA; public int sideB; public Rectangle(int x, int y) < super(); sideA = x; sideB = y; >public boolean equals(Object obj) < if(!(obj instanceof Rectangle)) return false; Rectangle ref = (Rectangle)obj; return (((this.sideA == ref.sideA) && (this.sideB == ref.sideB)) || (this.sideA == ref.sideB) && (this.sideB==ref.sideA)); >public static void main(String[] args) < Rectangle r1 = new Rectangle(10,20); Rectangle r2 = new Rectangle(10,10); Rectangle r3 = new Rectangle(20,10); System.out.println("r1.equals(r1) == "+r1.equals(r1)); System.out.println("r1.equals(r2) == "+r1.equals(r2)); System.out.println("r1.equals(r3) == "+r1.equals(r3)); System.out.println("r2.equals(r3) == "+r2.equals(r3)); System.out.println("r1.equals(null)=="+r1.equals(null)); >>

    В этом примере метод equals класса Retangle переопределен таким образом, чтобы прямоугольники были равны, если соблюдается геометрическое равенство, т.е. их можно наложить друг на друга.

    Выполнение программы выведет в консоль следующее сообщение :

    r1.equals(r1) == true r1.equals(r2) == false r1.equals(r3) == true r2.equals(r3) == false r1.equals(null) == false

    Дополнительно об equals можно прочитать здесь.

    Метод finalize

    Метод protected void finalize() throws Throwable — вызывается Java-машиной перед тем, как сборщик мусора (garbage collection) очистит память, занимаемую объектом. Объект «входит в сферу интересов» сборщика мусора, когда в выполняющейся программе не будет ни одной ссылки на объект. Перед очисткой занимаемой объектом памяти, будет вызван его метод finalize().

    Реализация метода finalize в классе Object не включает кода, т.е. не выполняет каких-либо действий. В классах-наследниках этот метод может быть переопределен для проведения всех необходимых действий по освобождению различных занимаемых ресурсов — закрытия сетевых соединений, файлов и т.д.

    Метод getClass

    Метод public final native Class getClass() возвращает объект типа Class, соответствующий классу объекта.

    Метод hashCode

    Функция hashCode возвращает хеш (hash code) объекта. Хеш-код представляет собой целое число, которое с большой вероятностью является уникальным для объекта. Данное значение используется коллекцией Hashtable для хранения данных с возможностью быстрой выборки объекта.

    Обычно метод hashCode не переопределяется. Но, если же, придется это сделать, то необходимо убедиться, чтобы метод возвращал одно и то же значение для равных между собой объектов. То есть, если x.equals(y) возвращает true, то зачения хеш-кодов x и y должны совпадать, то есть вызовы x.hashCode() и y.hashCode() должны возвращать одно и то же значение. В противном случае Hashtable будет считать объекты различными, не вызывая метод equals().

    Дополнительно о hashCode можно прочитать здесь.

    Метод toString

    Метод toString возвращает строковое представление объекта. В классе Object этот метод реализован следующим образом :

    public String toString()

    То есть, метод toString возвращает строку, содержащую название класса объекта и его хеш-код. В классах-наследниках этот метод может быть переопределен для получения более наглядного пользовательского представления объекта. Так для представленного выше примера Rectangle метод toString мог бы выглядеть следующим образом :

    @Override public String toString() < return getClass().getName() + "< sideA = " + String.value (sideA) + ", sideB = " + String.value (sideB) + " >"); >
    Метод clone

    Метод protected native Object clone() throws CloneNotSupportedException создает копию объекта. Для того, чтобы использовать данный метод, объект должен реализовывать интерфейс Cloneable, который не определяет никаких методов. Реализация интерфейса Cloneable только символизирует, что можно создавать копии объектов этого класса.

    В классе Object метод clone реализован таким образом, что копируются только базовые типы и ссылки на объекты. Если же потребуется «полное» копирование, то есть копирование не только ссылок на объекты, но и создание копии объектов, то в классах-наследниках метод clone нужно переопределить.

    Рассмотрим простой пример CloneTest.java, включающий 4 поля — целочисленный id, текстовую date, корзину basket типа List и свойство props типа HashMap. В классе реализованы методы Get/Set, и, кроме этого, класс включает методы addGoods, addGood для добавления товара списком и по отдельности. Определенные строки кода содержат строчные комментарии и будут рассмотрены ниже.

    package example; // import java.io.IOException; // import java.io.ByteArrayInputStream; // import java.io.ByteArrayOutputStream; // import java.io.Serializable; // import java.io.ObjectInputStream; // import java.io.ObjectOutputStream; import java.util.List; import java.util.Arrays; import java.util.HashMap; import java.util.ArrayList; public class CloneTest implements Cloneable // , Serializable < // private static final long serialVersionUID = 1L; private int id ; private String date ; private Listbasket; private HashMap props ; public CloneTest() < basket = new ArrayList(); > public int getId() < return id; >public void setId(int id) < this.id = id; >public String getDate() < return date; >public void setDate(String date) < this.date = date; >public List getBasket() < return basket; >public void setBasket(List basket) < this.basket = basket; >public HashMap getProps() < return props; >public void setProps(HashMap props) < this.props = props; >public void addGoods(final String[] list) < basket.addAll(Arrays.asList(list)); HashMaphm; hm = new HashMap(); for (int i = 0; i < list.length; i++) hm.put(Integer.valueOf(i + 1), list[i]); setProps(hm); >public void addGood(final String good) < basket.add(good); props.put(Integer.valueOf(props.size() + 1), good); >// @Override // public Object clone() throws CloneNotSupportedException // < // // Клонируемый объект // CloneTest obj = null; // try < // ByteArrayOutputStream bos; // ObjectOutputStream ous; // bos = new ByteArrayOutputStream(); // ous = new ObjectOutputStream(bos); // // Сохраняем объект в поток // ous.writeObject(this); // ous.close(); // ByteArrayInputStream bis; // ObjectInputStream ois; // bis = new ByteArrayInputStream(bos.toByteArray()); // ois = new ObjectInputStream(bis); // // Создаем новый объек из потока // obj = (CloneTest) ois.readObject(); // >catch (IOException e) < // >catch (ClassNotFoundException e) <> // return obj; // > public static void main(String[] args) < CloneTest ct1 = new CloneTest(); CloneTest ct2 = null; ct1.setId(1); ct1.setDate("01.12.2015"); String[] goods = ; ct1.addGoods(goods); // Используем стандартную реализацию метода clone() try < ct2 = (CloneTest) ct1.clone(); >catch (CloneNotSupportedException e) < e.printStackTrace(); >// Добавляем во второй объект ct2.addGood("Морковь"); // Проверяем атрибуты ct1 и ct2 на равенство System.out.println("ct1 = " + ct1.toString()); System.out.println("ct2 = " + ct2.toString()); System.out.println(); ct2.setId(2); System.out.println("ct2.id = " + ct2.getId()); System.out.println("ct1.id == ct2.id : " + (ct1.getId() == ct2.getId())); System.out.println(); System.out.println("ct2.date = " + ct2.getDate()); System.out.println("ct1.date == ct2.date : " + (ct1.getDate().equals(ct2.getDate()))); System.out.println(); System.out.println("ct1.basket : " + (ct1.basket)); System.out.println("ct2.basket : " + (ct2.basket)); System.out.println(); System.out.println("ct1.props : " + (ct1.props)); System.out.println("ct2.props : " + (ct2.props)); > >

    В методе main создается объект ct1 и значения его полей инициализируются. После этого создается клон объекта ct2, в который заносится товар «Морковь», изменяется идентификатор, и информация об объектах выводится в консоль :

    ct1 = example.CloneTest@1e859c0 ct2 = example.CloneTest@15c7850 ct2.id = 2 ct1.id == ct2.id : true ct2.date = 01.12.2015 ct1.date == ct2.date : true ct1.basket : [Картофель, Свекла, Морковь] ct2.basket : [Картофель, Свекла, Морковь] ct1.props : ct2.props :

    Результаты показывают, что объекты разные (первые две строчки). Но вот измененный идентификатор ct2 равен идентификатору ct1. Кроме этого «Морковь», добавленная в ct2, присутствует и в ct1. То есть, встроенный метод clone копирует ссылки на внутренние объекты. Поэтому изменение значения одного из полей затрагивает оба объекта.

    Если же необходимо получить новый независимый объект, соответствующий исходному, то нужно должным образом переопределить метод clone.

    Наиболее удобным и гибким способом клонирования объекта является механизм сериализации. Он сохраняет объект в поток байтов с последующим его восстановлением из потока. Для решения данной задачи, необходимо только убрать строчные комментарии и запустить пример на исполнение. Результат говорит сам за себя : значения идентификаторов отличаются, как и отличается содержимое корзины.

    ct1 = example.CloneTest@a470b8 ct2 = example.CloneTest@1975b59 ct2.id = 2 ct1.id == ct2.id : false ct2.date = 01.12.2015 ct1.date == ct2.date : true ct1.basket : [Картофель, Свекла] ct2.basket : [Картофель, Свекла, Морковь] ct1.props : ct2.props :

    Таким образом, сериализация является наиболее предпочтительным вариантом для получения независимого клонированного объекта.

    Class

    В исполняемой java-программе каждому классу соответствует объект типа Class, который содержит необходимую для описания класса информацию (поля, методы и т.д.). Класс Class не имеет открытого конструктора – объекты этого класса создаются автоматически Java-машиной по мере загрузки классов и вызовов метода defineClass загрузчика классов. Получить экземпляр Class для конкретного класса можно воспользовавшись перегруженным методом forName :

    public static Class forName (String name, boolean initialize, ClassLoader loader); public static Class forName(String className);

    Метод forName возвращает объект Class, соответствующий классу или интерфейсу с названием, указанным в name. Необходимо указывать полное название класса или интерфейса (наименование пакета и наименование класса), используя переданный загрузчик классов. Если в качестве загрузчика классов loader передано значение null, будет применен тот загрузчик, который использовался для загрузки вызывающего класса. При этом класс будет инициализирован, только если значение initialize равно true и класс не был инициализирован ранее.

    Проще и удобнее воспользоваться методом forName(className), передав только название класса. При этом будет использоваться загрузчик вызывающего класса, и класс будет инициализирован, если до этого не был.

    Метод public Object newInstance() создает и возвращает объект класса, который представляется данным экземпляром Class. При создании используется конструктор без параметров. Если класс не содержит такого конструктора, то будет вызвано исключение InstantiationException. Это же исключение будет брошено, если объект Class соответствует абстрактному классу, интерфейсу или же по какой-либо другой причине.

    Каждому методу, полю, конструктору класса также соответствуют объекты, которые можно получить вызовом следующих методов объекта Class : getMethods(), getFields(), getConstructors(), getDeclaredMethods() и т.д. Данные методы возвращают объекты, которые отвечают за поля, методы, конструкторы объекта. Их используют для формирования динамических вызовов Java. Такой процесс называется рефлексией кода (reflection). Классы, используемые в reflection содержатся в пакете java.lang.reflection.

    Пример работы с объектом Class

    Динамическое создание экземпляров не обязательно всегда сопровождается вызовом методов посредством reflection. Это продемонстрировано в следующем примере :

    package example; interface Vehicle < void go(); >class Automobile implements Vehicle < public void go() < System.out.println("\tавтомобиль поехал!"); >> class Truck implements Vehicle < public Truck(int i) < super(); >public void go() < System.out.println("\tгрузовик поехал!"); >> public class ClassExample < public static void main(String[] args) < Vehicle vehicle; String[] vehicleNames = ; for(int i = 0; i < vehicleNames.length; i++)< try < String name = vehicleNames[i]; System.out.println("Class : " + name); ClassaClass = Class.forName(name); System.out.println("\tсоздание автомобиля . "); vehicle = (Vehicle)aClass.newInstance(); System.out.println("\tnewInstance : " + vehicle.getClass()); vehicle.go(); > catch(ClassNotFoundException e) < System.out.println(e.toString()); >catch(InstantiationException e) < System.out.println(e.toString()); >catch(Throwable th) < System.out.println("Throwable : " + th.toString()); >> > >

    В консоль будет выведено следующее сообщение :

    Class : example.Automobile создание автомобиля . newInstance : class example.Automobile автомобиль поехал! Class : example.Truck создание автомобиля . java.lang.InstantiationException: example.Truck Class : example.Aircraft java.lang.ClassNotFoundException: example.Aircraft

    Как видим из текста сообщения, объект класса Automobile был успешно создан, получен его экземляр Instance, определенный интерфейсом Vehicle, и вызван метод go.

    Класс Truck был найден, но при создании объекта этого класса, вызывается отсутствующий в описании конструктор без параметров, вследствие чего было выброшено и обработано исключение java.lang.InstantiationException. Этого можно было бы избежать, если бы в описание класса Truck был бы включен пустой конструктор public Truck() <>.

    Класс example.Aircraft не был определен, и при попытке получить соответствующий данному объекту Class, было вызвано исключение java.lang.ClassNotFoundException.

    Math

    Класс Math состоит из набора статических методов, выполняющих наиболее популярные математические вычисления, и двух констант, имеющих особое значение в математике — это число Пи и экспонента. Константы определены следующим образом :

    • public static final double Matht.PI — задает число Пи
    • public static final double Matht.E — число e

    Часто класс Math называют классом-утилитой (Utility class), т.к. все методы класса статические и нет необходимости создавать экземпляр этого класса — поэтому он и не имеет открытого конструктора. Этот класс нельзя также и унаследовать, поскольку он объявлен с атрибутом final.

    Методы класса Math

    Тип Метод Описание
    double abs(double a) Возвращает абсолютное значение типа double
    float abs(float a) Возвращает абсолютное значение типа byte
    int abs(int a) Возвращает абсолютное значение типа int. abs вернет значения типа int, если в качестве параметра будут переданы значения типа byte, short, char.
    long abs(long a) Возвращает абсолютное значение типа long
    double acos(double a) Вернет значение арккосинуса угла в диапазоне от 0 до PI
    double asin(double a) Вернет значение арксинуса угла в диапазоне от -PI/2 до PI/2
    double atan(double a) Вернет значение арктангенса угла в диапазоне от -PI/2 до PI/2
    double ceil(double a) Возвращает наименьшее целое число которое больше a
    double floor(double a) Возвращает целое число которое меньше a
    double cos(double a) Возвращает косинус угла
    double IEEEremainder(double a, double b) Возвращает остаток от деления a/b по стандарту IEEE 754
    double sin(double a) Возвращает косинус угла
    double tan(double a) Возвращает тангенс угла
    double exp(double a) Возвращает e в степени числа a
    double log(double a) Возвращает натуральный логарифм числа a
    double max(double a, double b) Возвращает наибольшее из двух чисел типа double
    float max(float a, float b) Возвращает наибольшее из двух чисел типа double
    long max(long a, long b) Возвращает наибольшее из двух чисел типа long
    int max(int a, int b) Возвращает наибольшее из двух чисел типа int
    double min(double a, double b) Возвращает наименьшее из двух чисел типа double
    float min(float a, float b) Возвращает наименьшее из двух чисел типа double
    long min(long a, long b) Возвращает наименьшее из двух чисел типа long
    int min(int a, int b) Возвращает наименьшее из двух чисел типа int
    double pow(double a, double b) Возвращает а в степени b
    double random() Возвращает случайное число в диапазоне от 0.0 до 1.0
    double rint(double a) Возвращает int число, ближайшее к a

    String

    Класс String используется в Java для хранения и представления не модифицируемых строк. После того как создан экземпляр этого класса, строка уже не может быть модифицирована. Для создания объекта String можно использовать различные варианты конструктора. Наиболее простой — если содержимое строки известно на этапе компиляции — это использовать один из следующих подходов :

    String abc = "abc"; String cde = new String("cde");

    На первый взгляд, эти варианты создания строк отличаются только синтаксисом. На самом деле различие есть, хотя в большинстве случаев его можно и не заметить. Каждый строковый литерал имеет внутреннее представление, как экземпляр класса String.

    Классы в JAVA могут иметь целый набор таких строк и, когда класс компилируется, экземпляр представляющий литерал, добавляется в этот набор. Однако, если такой литерал уже имеется где-то в другом месте класса, т.е. уже представлен в наборе строковых объектов, то новый экземпляр (фактически копирующий уже существующий) создан не будет. Вместо этого будет создана ссылка на уже имеющийся объект. Т.к. строки не являются модифицируемыми объектами, то это не нанесет никакого урона другим фрагментам программы. С другой стороны, если объект-строка создается с помощью явного вызова конструктора, то даже если эти строки будут совершенно идентичными, экземпляры класса String будут отличаться.

    В объекте String определен метод equals() который сравнивает две строки на предмет идентичности. В следующем примере сравниваются две строковых переменных с одинаковыми значениями.

    public class StringTest < public StringTest() <>public static void main(String[] args) < Test t = new Test(); String s1 = "Hello world"; String s2 = "Hello world"; System.out.println("String`s equally = " + (s1.equals(s2))); System.out.println("Strings are the same = " + (s1 == s2)); >>

    В консоль будет выведено следующее сообщение :

    String`s equally = true Strings are the same = true

    Но вот, если строку определения переменной s2 определить следующим образом :

    String s2 = new String("Hello world");

    то сообщение в консоле изменится :

    String`s equally = true Strings are the same = false

    При первом варианте для создания двух строк используются строковые литералы, поэтому ссылки s1 и s2 ссылаются на один и тот же объект. Во втором случае для строки s2 используется конструктор. Поэтому, несмотря на то, что строки идентичны, переменные ссылаются на разные объекты, которые, в сущности, создаются во время выполнения программы и не находятся во множестве строковых констант, которое создается на момент компиляции.

    Необходимо отметить, что при создании экземпляров строк во время выполнения (run-time), они не помещаются в набор строковых констант. Однако, можно явно указать на необходимость поместить, вновь создаваемый экземпляр класса String в этот набор, применив метод intern(), т.е. если определить строку s2 следующим образом :

    String s2 = new String("Hello world. ").intern();

    то в консоль будет выведено первое сообщение.

    Если все строки находятся в наборе, сформированном при компиляции, то для сравнения строк, вместо метода equals() можно использовать оператор ‘==’, который выполняется значительно быстрее.

    В JAVA для конкатенация строк можно использовать оператор ‘+’ и метод String concat(String s). Следует обратить внимание на то, что строки являются не модифицируемыми объектами. И если используется оператор конкатенации или какой-либо вспомогательный метод класса String, то изменения строки не произойдет, а будет создан новый экземпляр класса String. Также следует обратить на использование в методах параметров типа String. Несмотря на то, что String является объектом и передается в метод по ссылке, String не модифицируемый объект и все изменения в методе не повлекут изменений исходного объекта.

    Метод trim() класса String позволяет удалить пробелы в строке, расположенные в начале и в конце строки.

    Помните, что после выполнения операций trim и concat создается новый объект.

    Строка состоит из шестнадцатибитовых UNICODE символов. Однако во многих случаях требуется работать с восьмибитовыми символами (ввод/вывод, работа с базой данных и т.д.). Преобразование строки в последовательность байтов (восьмибитовые символы) производится методами :

    • byte[] getBytes(); — возвращает последовательность байтов, в кодировке принятой по умолчанию.
    • byte[] getBytes(String encoding); — возвращает последовательность байтов, в кодировке encoding;
    • String(byte[] bytes); — создает строку из последовательности байтов в кодировке принятой по умолчанию;
    • String(byte[] bytes,String encoding); — создает строку из последовательности байтов в указанной кодировке.

    Оператор ‘+’ для класса String переопределен. Так если оператор ‘+’ применить к экземплярам класса String, то будет осуществлена конкатенация строк и, если один из операндов не принадлежит классу String (не первый), то он будет неявно приведен к этому типу, как будто бы был использован метод String.valueOf(). Например :

    System.out.println("1" + 5) выведет на консоль 15 System.out.println(1 + 5) выведет на консоль 6

    StringBuffer

    Класс StringBuffer используется для создания и модификации строковых выражений, из которых можно создать String. В отличии от неизменяемого String он реализован на основе массива char[] и, после создания объекта, значение содержащейся в нем строки может быть изменено.

    Наиболее часто используемые конструкторы класса StringBuffer :

    • StringBuffer () — пустой объект StringBuffer;
    • StringBuffer (String s) — объект со строкой s;
    • StringBuffer (int capacity) — объект c заранее заданным размером массива.

    Определение размера массива не означает, что нельзя будет манипулировать со строками, размер которых более указанной при создании объекта. Это всего лишь говорит о том, что при манипулировании строками, длина которых меньше указанной, не потребуется выделения дополнительной памяти.

    Пример использования StringBuffer
    package example; public class StringBufferExample < void addString(StringBuffer sb, final String text) < sb.append(text); >public static void main(String[] args) < StringBuffer sb = new StringBuffer("Привет"); System.out.println("До : '" + sb + "'"); StringBufferExample sbe = new StringBufferExample(); sbe.addString(sb, " мир!"); System.out.println("После : '" + sb.toString() + "'"); >>

    В результате в консоль будет выведено следующее сообщение :

    До : 'Привет' После : 'Привет мир!'

    Основные методы, используемые для модификации StringBuffer

    /** * Метод добавления строки str к уже имеющейся в объекте */ append(String str) /** * Метод вставки строки str начиная с позиции offset (пропуская offset символов) */ insert(int offset, String str)

    System

    Класс System содержит набор полезных статических методов и полей. Экземпляр этого класса получить нельзя. Среди прочих полезных средств, предоставляемых классом System, особо стоит отметить

    • стандартные потоки ввода и вывода;
    • поток вывода ошибок;
    • доступ к внешне определенным свойствам;
    • возможность загрузки файлов и библиотек;
    • утилиту для быстрого копирования порций массивов.

    Наиболее широко используемым является стандартный вывод, доступный через переменную System.out. Стандартный вывод можно перенаправить в другой поток (файл, массив байт и т.д., главное, что бы это был объект PrintStream). Следующий код демонстрирует использование класса System :

    public static void main(String[] args) < System.out.println("Описание Java"); try < PrintStream print = new PrintStream( new FileOutputStream("с:/system-out.txt")); System.setOut(print); System.out.println("Изучение Java"); >catch(FileNotFoundException e) < e.printStackTrace(); >>

    При запуске этого кода, в консоль будет выведено только

    Описание Java

    И в файл «с:/system-out.txt» будет записано «Изучение Java».

    Аналогичным образом можно перенаправить стандартный ввод System.in вызовом System.setIn(InputStream) и System.err — вызовом System.setErr(PrintStream).

    Потоки ввода/вывода можно закрыть. Для этого следует использовать следующий код :

    try < System.in.close(); System.out.close(); >catch (IOException e)

    Следующие методы класса System позволяют использовать некоторые параметры системы :

    • public static void runFinalizersOnExit (boolean value) — определяет вызов метода finalize() у всех объектов (у кого еще не вызывался) при завершении программы;
    • public static native long currentTimeMillis() — возвращает текущее время в миллисекундах, прошедших с 1-го января 1970 года;
    • public static String getProperty(String key) — получение значения свойства с названием key;
    • public static java.util.Properties getProperties() — получение объекта java.util.Properties, в котором содержатся значения всех определенных системных свойств.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *