Опубликован: 18.09.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 11:

Основные конструкции языков Java и C# (продолжение)

Библиотеки

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

Для Java этот процесс начался значительно раньше и захватил гораздо больше участников в силу более раннего появления платформы и ее большей открытости и стандартизованности. Поэтому далеко не все часто используемые библиотеки классов распространяются в составе платформ J2SE и J2EE. Разработка библиотек .NET ведется, в основном, силами программистов, работающих в Microsoft и некоторых ее партнерах.

В данном разделе дается краткий обзор основных библиотек, подробности см. в [10] и [11].

Основные классы языка Java содержатся в пакете java.lang.

Основные классы C# содержатся в пространстве имен System в сборке mscorlib.

Базовым классом для всех ссылочных типов Java служит класс java.lang.Object.

Этот класс содержит следующие методы.

boolean equals(Object) — предназначен для сравнения объектов с учетом их внутренних данных, перегружается в наследниках. В классе Object сравнивает объекты на совпадение.

int hashCode() — возвращает хэш код данного объекта, используется в хэширующих коллекциях. Должен перегружаться одновременно с методом equals().

String toString() — преобразует данный объект в строку, перегружается в наследниках. В классе Object выдает строку из имени класса и уникального кода объекта в JVM.

Class<? extends Object> getClass() — возвращает объект, представляющий класс данного объекта.

protected void finalize() — вызывается сборщиком мусора на одном из этапов удаления объекта из памяти. Может быть перегружен.

protected Object clone() — предназначен для построения копий данного объекта, перегружается в наследниках. В классе Object копирует поля данного объекта в новый, если класс данного объекта реализует интерфейс java.lang.Cloneable, иначе выбрасывает исключение.

void wait(), void wait(long timeout), void wait(long timeout, int nanos)методы, приостанавливающие выполнение текущего потока до вызова notify() или notifyAll() другим потоком в данном объекте или до истечения заданного интервала времени.

void notify(), void notifyAll()методы, оповещающие потоки, которые ждут оповещения по данному объекту. Первый метод "отпускает" только один из ждущих потоков, второй — все.

Базовым типом для всех типов C# служит класс System.Object, который также имеет имя object.

bool Equals(object) — аналог метода equals() в Java.

static bool Equals(object, object) — сравнивает два объекта с помощью Equals() или на равенство обеих ссылок null.

static bool ReferenceEquals(object, object) — сравнивает ссылки на заданные объекты.

int GetHashCode() — аналог метода hashCode() в Java. Должен перегружаться одновременно с методом Equals().

string ToString() — аналог метода toString() в Java. В object выдает только имя типа данного объекта.

System.Type GetType() — возвращает объект, представляющий тип данного объекта.

protected object MemebrwiseClone() — создает копию данного объекта, имеющую те же значения всех полей.

Класс System предоставляет доступ к элементам среды выполнения программы и ряд полезных утилит. Все его элементы — статические.

Поля in, out и err в этом классе представляют собой ссылки на стандартные потоки ввода, вывода и вывода информации об ошибках. Они могут быть изменены при помощи методов setIn(), setOut() и setErr().

Методы long currentTimeMillis() и long nanoTime() служат для получения текущего значения времени.

void exit(int status) — прекращает выполнение Java машины, возвращая указанное число внешней среде в качестве кода выхода.

void gc() — запускает сборку мусора. Время от времени сборка мусора запускается и самостоятельно.

Методы getenv(), getProperties() и getProperty() служат для получения текущих значений переменных окружения и свойств Java машины, задаваемых ей при запуске с опцией –d.

load(), loadLibrary() — служат для загрузки библиотек, например, реализующих native интерфейсы.

void arraycopy() — используется для быстрого копирования массивов.

int identityHashCode(Object) — возвращает уникальный числовой идентификатор данного объекта в Java машине.

Другой класс, содержащий методы работы со средой выполнения, — Runtime.

Данные о среде выполнения можно получить с помощью класса Environment.

В нем имеются методы GetEnvironmentVariables() и GetEnvironmentVariable() для получения значений переменных окружения, методы для получения командной строки, метод Exit(int) для прекращения работы текущего процесса, свойства с данными о машине и текущем пользователе, свойство TickCount, хранящее количество миллисекунд с момента запуска системы, и пр.

Управлять стандартным вводом-выводом можно с помощью класса Console.

Он содержит свойства In, Out, Err, методы для чтения из потока стандартного ввода и для записи в поток стандартного вывода, а также много других свойств консоли.

Для работы со строками используются классы String, StringBuffer и StringBuilder (последний появился в Java 5). Все они реализуют интерфейс последовательностей символов CharSequence.

Класс String представляет неизменяемые строки, два других класса — изменяемые. Отличаются они тем, что все операции StringBuffer синхронизованы, а операции StringBuilder — нет. Соответственно, первый класс нужно использовать для представления строк, с которыми могут работать несколько потоков, а второй — для повышения производительности в рамках одного потока.

Для работы со строками используются классы System.String, представляющий неизменяемые строки, и System.Text.StringBuilder, представляющий изменяемые строки.

В пакете java.lang находятся классы-обертки примитивных типов Boolean, Byte, Character, Short, Integer, Long, Float, Double.

Все числовые классы наследуют классу java.lang.Number.

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

Для форматированного представления чисел используются классы java.text.NumberFormat и java.text.DecimalFormat.

Обертками примитивных типов C# служат следующие структурные типы из пространства имен System.

Boolean, Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal.

Они также содержат аналогичные константы и методы.

Для работы с форматированным строковым представлением чисел используются методы Parse() и ToString() тех же классов с дополнительными параметрами, реализующими интерфейс IFormatProvider. Чаще всего это объекты класса System.Globalization. NumberFormatInfo.

Набор математических функций и констант реализован в виде элементов класса java.lang.Math.

Для генерации псевдослучайных чисел можно использовать как метод Math.random(), так и обладающий большей функциональностью класс java.util.Random.

Для более сложных вычислений можно использовать классы пакета java.mathBigInteger и BigDecimal, представляющие целые числа произвольной величины и десятичные дроби произвольной точности.

Набор математических функций и констант реализован в виде элементов класса System.Math.

Для генерации псевдослучайных чисел используется класс System.Random.

java.lang.Thread — класс, объекты которого представляют потоки в Java машине.

Он содержит методы, позволяющие прервать ожидание данным потоком синхронизационной операции ( interrupt() ), подождать конца работы данного потока ( join() ), запустить поток ( start() ), приостановить выполнение текущего потока на какое-то время ( sleep() ), получить текущий поток ( currentThread() ), а также получить различные характеристики данного потока (приоритет, имя, и пр.).

Класс java.lang.ThreadLocal служит для хранения значений, которые должны быть специфичны для потока. Т.е. значение, получаемое методом get() из объекта этого класса, — то самое, которое текущий поток сохранил ранее с помощью метода set().

Классом, представляющим потоки. NET в C#, является System.Threading.Thread.

Текущий поток может быть получен с помощью его свойства CurrentThread.

Этот класс тоже содержит методы Interrupt(), Join(), Start(), Sleep() и др.

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

CharSequence — интерфейс последовательности символов.

Cloneable — маркирующий интерфейс объектов, для которых можно строить копии. Сам по себе он не требует реализации каких-либо методов, хотя для построения копий нужно перегрузить метод clone(), а лишь позволяет использовать функциональность этого метода в классе Object.

Iterable<T> — интерфейс итерируемых коллекций. Объекты, реализующие этот интерфейс, могут, наравне с массивами, использоваться в инструкции цикла по коллекции.

Comparable<T> — интерфейс, реализуемый классами, объекты которых линейно упорядочены, т.е. любые два объекта этого класса сравнимы по отношению "больше/меньше". Используется, например, для реализации коллекций с быстрым поиском.

Аналогичные интерфейсы в C# следующие.

System.ICloneable — требует реализации метода Clone() для создания копий.

System.Collections.IEnumerable, System.Collections.Generic. IEnumerable<T> — интерфейсы итерируемых коллекций.

System.IComparable, System.IComparable<T> — интерфейсы типов, объекты которых линейно упорядочены.

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

В пакете java.lang также находится ряд классов, объекты которых представляют элементы самого языка — Class<T>, представляющий классы, Enum<T>, представляющий перечислимые типы, и Package, представляющий пакеты.

Все эти классы, а также классы, находящиеся в пакете java.lang.reflect (Field, Method, Constructor) используются в рамках механизма рефлексии (reflection) для доступа к информации об элементах языка во время выполнения программы. На механизме рефлексии построены очень многие среды и технологии, входящие в платформу Java, например JavaBeans.

Для C# аналогичную роль в механизме рефлексии играют классы System.Type, System.ValueType, System.Enum и классы, входящие в пространство имен System.ReflectionMemberInfo, MethodInfo, FieldInfo, и т.д.

Для анализа структуры и элементов массивов во время работы программы можно использовать методы класса java.lang.reflect.Array, позволяющие определить тип элементов массива, получить их значения, создавать новые массивы и пр.

Для манипуляций с массивами — поиска, сортировки, сравнения и пр. — используются методы класса java.util.Arrays.

Аналогом обоих классов Java для работы с массивами служит класс System.Array.

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

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

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Андрей Швецов
Андрей Швецов
Россия, Александровск, школа-гимназия №2 им. Островского, 2005
Анна Оганян
Анна Оганян
Россия, Москва, МГОУ