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

Основные конструкции языков Java и C#

Базовые типы и операции над ними

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

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

В Java только примитивные типы являются типами значений, все другие типы — ссылочные, являются наследниками класса java.lang.Object.

В C# есть возможность декларировать пользовательские типы значений — структурные типы и перечисления. Ссылочные типы называются классами и интерфейсами. Структурные типы, так же как и ссылочные, наследуют классу System.Object, который также можно использовать под именем object.

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

Между значениями примитивного типа и объектами соответствующего ему класса-обертки определены преобразования по умолчанию — упаковка и распаковка ( autoboxing и auto-unboxing, введены в Java 5), позволяющие во многих случаях не создавать объект по значению и не вычислять значение по объекту явно. Но можно производить их и явно.

Однако вызывать методы у значений примитивных типов нельзя.

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

Поэтому все элементы класса object имеются во всех примитивных типах — у их значений можно, как у обычных объектов, вызывать методы.

Вполне законны, например, выражения

2.Equals(3) и (-175).ToString().

Логический тип

В Java он назван boolean, а его обертка — java.lang.Boolean.

В C# он назван bool, а его обертка — System.Boolean.

Значения этого типа — логические значения, их всего два — true и false. Нет никаких неявных преобразований между логическими и целочисленными значениями. Над значениями этого типа определены следующие операции:

  • == и != — сравнения на равенство и неравенство.
  • ! — отрицание.
  • && и || — условные (короткие) конъюнкция и дизъюнкция (‘и’ и ‘или’). Второй аргумент этих операций не вычисляется, если по значению первого уже ясно, чему равно значение выражения, т.е. в случае конъюнкции — если первый аргумент равен false, а в случае дизъюнкции — если первый аргумент равен true. С помощью условного оператора ?: их можно записать так: (x && y) — ((x)?(y): false), (x || y) — ((x)? true :(y)). Напомним, что означает условный оператор — выражение a?x:y вычисляет значение a, если оно true, то вычисляется и возвращается значение x, иначе вычисляется и возвращается значение y.
  • & и | — (длинные) конъюнкция и дизъюнкция (‘и’ и ‘или’). У этих операций оба аргумента вычисляются всегда.
  • ^ — исключающее ‘или’ или сумма по модулю 2.
  • Для операций &, |, ^ имеются соответствующие операторы присваивания &=, |=, ^=. Выражение x op= y, где op — одна из операций &, |, ^, имеет тот же эффект, что и выражение x = ((x) op (y)), за исключением того, что значение x вычисляется ровно один раз.

Целочисленные типы

В обоих языках имеются следующие целочисленные типы:

  • Тип байтовых целых чисел, называемый в Java byte, а в C#sbyte. Его значения лежат между –27 и (27–1) (т.е. между –128 и 127)
  • short, чьи значения лежат в интервале -215 – (215-1) (-32768 – 32767)
  • int, чьи значения лежат в интервале -231 – (231-1) (-2147483648 – 2147483647)
  • long, чьи значения лежат в интервале -263 – (263-1) (-9223372036854775808 – 9223372036854775807)

В C# имеются беззнаковые аналоги всех перечисленных выше типов:

свой тип byte со значениями от 0 до (28–1 = 255).

ushort со значениями от 0 до (216–1) = 65535

uint со значениями от 0 до (232–1) = 4294967295

ulong со значениями от 0 до (264–1) = 18446744073709551615

Классы-обертки целочисленных типов называются так:

java.lang.Byte
java.lang.Short
java.lang.Integer
java.lang.Long

Типы-обертки целочисленных типов называются так:

System.SByte
System.Byte
System.Int16
System.UInt16
System.Int32
System.UInt32
System.Int64
System.UInt64

Минимальные и максимальные значения примитивных типов можно найти в их типах-обертках в виде констант (static final полей) MIN_VALUE и MAX_VALUE.

Минимальные и максимальные значения примитивных типов можно найти в их типах-обертках в виде констант MinValue и MaxValue.

Над значениями целочисленных типов определены следующие операции:

  • ==, != — сравнение на равенство и неравенство.
  • <, <=, >, >= — сравнение на основе порядка.
  • +, -, *, /, % — сложение, вычитание, умножение, целочисленное деление, взятие остатка по модулю.
  • ++, -- — увеличение и уменьшение на единицу. Если такой оператор написан до операнда, то значение всего выражения совпадает с измененным значением операнда, если после — то с неизмененным.

    В результате выполнения последовательности действий

    x = 1; y = ++x; z = x++;

    значение x станет равно 3, а значения y и z — 2.

  • ~, &, |, ^ — побитовые операции дополнения, конъюнкции, дизъюнкции и исключающего ‘или’.
  • <<, >> — операторы, сдвигающие биты своего первого операнда влево и вправо на число позиций, равное второму операнду.

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

    Специальный оператор >>> используется для сдвига вправо с заполнением освобождающихся слева битов нулями.

    В C# оператор >> сдвигает вправо биты числа, дополняя его слева для чисел со знаком значением знакового бита, а для беззнаковых чисел — нулем.

  • Для операций +, -, *, /, %, ~, &, |, ^, <<, >>Java -специфичной операции >>> ) имеются соответствующие операции присваивания. При этом выражение x op= y, где op — одна из этих операций, эквивалентно выражению x = (T)((x) op (y)), где T — тип x, за исключением того, что значение x вычисляется ровно один раз.

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

Таким образом, эти операции реализуют арифметику по модулю 2n для n, подходящего для данного типа.

Арифметические операции над целыми числами приводят к созданию исключений только в трех случаях: при делении на 0 или вычислении остатка по модулю 0, при конвертации в примитивный тип ссылки на объект класса обертки, равной null, а также при исчерпании доступной Java -машине памяти, которое может случиться из-за применения операций -- и ++ с одновременным созданием объектов классов-оберток.

В C# результат арифметических действий над целочисленными данными, приводящих к переполнению, зависит от контекста, в котором эти действия производятся.

Если действие происходит в unchecked контексте (т.е. внутри блока или выражения, помеченных ключевым словом unchecked ), то вычисления производятся в арифметике по подходящему модулю 2n.

Если же эти действия производятся в checked контексте (т.е. внутри блока или выражения, помеченных модификатором checked ), то переполнение приводит к созданию исключения.

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

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

В обоих языках целочисленным типом считается и тип char, чьими значениями являются 16-битные символы (от '\u0000' до '\uffff' ). Для него определен тот же набор операций, но преобразования между ним и другими типами по умолчанию не производятся (явные преобразования возможны).

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

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

Спасибо!

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

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

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

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