Главная страница
Навигация по странице:

  • Управляющая последовательность Описание \ddd Восьмеричный символ Шестнадцатеричный символ Unicode (хххх)

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

  • 8 Часть I. Язык Несколько примеров объявления переменных различных типов приведено ниже. Обратите внимание на то, что некоторые объявления осуществляют инициализацию переменных а, Ь, с

  • Д инамическая инициализация

  • System.out.println("х и уху) х = у * 2 ; }// у = 100; // Ошибка у неизвестна в этой области видимости переменная х известна и здесь.

  • Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


    Скачать 25.04 Mb.
    НазваниеС. Н. Тригуб Перевод с английского и редакция
    АнкорJava. Полное руководство. 8-е издание.pdf
    Дата28.02.2017
    Размер25.04 Mb.
    Формат файлаpdf
    Имя файлаJava. Полное руководство. 8-е издание.pdf
    ТипДокументы
    #3236
    страница6 из 90
    1   2   3   4   5   6   7   8   9   ...   90
    79
    Начиная с JDK 7 вы можете также внедрить в целочисленный литерал один или несколько символов подчеркивания. Это облегчает чтение больших целочисленных литералов. При компиляции символы подчеркивания в литерале игнорируются. Например, в данном случае х = 123_45б_789;

    значением переменной х будет 123 456 789. Символы подчеркивания будут проигнорированы. Символы подчеркивания можно использовать только для разделения цифр. Они не могут располагаться вначале или в конце литерала, но вполне допустимо использование между двумя цифрами нескольких символов подчеркивания. Например, следующее вполне правильно х = 123___ 456___ Использование символов подчеркивания в целочисленном литерале особенно полезно при написании в коде таких элементов, как номера телефонов, идентификационные номера клиентов, номера частей и т.д. Они также полезны для визуальных группировок при определении двоичных литералов. Например, двоичные значения зачастую визуально группируются в блоки по четыре цифры, как показано далее х = О Ы 101_0101_0 0 Литералы с плавающей точкой

    Числа с плавающей точкой представляют десятичные значения с дробной частью. Они могут быть выражены в стандартной или научной форме записи. Число в стандартной форме записи состоит из целого числа, за которым следуют десятичная точка и дробная часть. Например, 2 .0 , 3 .1 4 1 5 9 и 0 .6 6 6 7 представляют допустимые числа с плавающей точкой в стандартной записи. Научная форма записи использует стандартную форму записи числа с плавающей точкой, к которой добавлен суффикс, указывающий степенную функцию числа 10, на которую нужно умножить данное число. Для указания экспоненциальной функции используют символ Е или е, за которым следует десятичное число (положительное или отрицательное. Примерами могут служить 6 . ЕЕ и 2е+100.
    По умолчанию в Java литералам с плавающей точкой присвоен тип d o u ­
    b l e . Чтобы указать литерал типа f l o a t , к нему нужно дописать символ F или f . Литерал типа d o u b le можно также указать явно, дописывая к нему символ D или d. Но, естественно, это излишне. Используемый по умолчанию тип d o u b le занимает в памяти 64 битв то время как меньший тип f l o a t требует для хранения только 32 бит.
    Ш естнадцатеричные литералы с плавающей точкой также поддерживаются, но используются они редко. Они должны быть в форме, подобной экспоненциальному представлению, нос Р или р вместо Е или е. Например, 0x12 . Р — вполне допустимый литерал с плавающей точкой. Значение после буквы Р называется двоичным порядком (binary exponent) и указывает степень числа два, на которое умножается число. Поэтому 0x12 . Р представляет число Начиная с JDK 7 вы можете внедрить в литерал с плавающей точкой один или несколько символов подчеркивания. Это работает точно также, как и для целочисленных литералов, которые были описаны выше. Символы подчеркивания облегчают чтение больших литералов с плавающей точкой. При компиляции символы подчеркивания игнорируются. Например, в данном случае num = 9_423_497_862.0;


    8 Часть I. Язык значением num будет 9 423 497 862,0. Символы подчеркивания будут проигнорированы. Как ив случае с целочисленными литералами, символы подчеркивания могут использоваться только для разделения цифр. Они не могут располагаться вначале или конце литерала, но вполне допустимо использование между двумя цифрами нескольких символов подчеркивания. Допустимо также использование символов подчеркивания в дробной части числа. Например, следующий код вполне правилен num = 9_423_4 9 7 В данном случае дробная часть — .1 0 Булевы литералы
    Эти литералы очень просты. Тип
    Boolean может иметь только два значения true и false. Эти значения не преобразуются нив какие числовые представления. В Java литерал true неравен, а литерал false
    — 0. В Java логические литералы могут быть присвоены только тем переменным, которые объявлены как boolean, или использоваться в выражениях с булевыми операциями.
    Символьные литералы
    В Java символы представляют собой индексы в наборе символов Unicode. Это битовые значения, которые могут быть преобразованы в целые значения и по отношению к которым можно выполнять целочисленные операции, такие как операции сложения и вычитания. Символьные литералы указываются внутри пары одинарных кавычек. Все отображаемые символы ASCII можно вводить непосредственно, указывая их в кавычках, например ' аи. Для ввода символов, непосредственный ввод которых невозможен, можно использовать несколько управляющих последовательностей, которые позволяют вводить нужные символы, такие как 1 \ ' ' для символа одинарной кавычки и ' \ п 1 для символа новой строки. Существует также механизм для непосредственного ввода значения символа в восьмеричном или шестнадцатеричном виде. Для ввода значения в восьмеричной форме используют символ обратной косой черты, за которым следует трехзначный номер. Например, последовательность ' \ 1 4 1 1 эквивалентна букве ' а '. Для ввода шестнадцатеричного значения применяются символы обратной косой черты и u и ), за которыми следуют четыре шестнадцатеричные цифры. Например, 1
    \u00 6 1 1 представляет букву ' а ' из набора символов ISO-Latin-1, поскольку старший байт является нулевым, а 1 иа4 3 2 ' — это символ японской катака- ны. Управляющие последовательности символов перечислены в табл. Таблица 3.3. Управляющие последовательности символов
    Управляющая последовательность
    Описание
    \ddd
    Восьмеричный символ Шестнадцатеричный символ Unicode
    (хххх)
    \ 'Одинарная кавычка
    \"
    Двойная кавычка Обратная косая черта

    Возврат каретки
    \п
    Новая строка (этот символ называют также символом перевода строки
    Глава 3. Типы данных, переменные и массивы
    81
    Окончание табл Управляющая последовательность
    Описание
    \f
    Подача страницы
    \t
    Табуляция
    \b
    Возврат на одну позицию (“забой”)
    Строковые литералы
    Указание строковых литералов в Java осуществляется также, как в других языках, — заключаем последовательности символов в двойные кавычки. Вот несколько примеров строковых литералов World"
    "two\nlines"
    "V'This is in Управляющие символы и восьмеричная/ш естнадцатеричная формы записи, определенные для символьных литералов, работают точно также и внутри строковых литералов. Важно отметить, что в Java строки должны начинаться и заканчиваться водной строке. В этом языке отсутствует какой-либо управляющий символ продолжения строки, подобный тем, что имеются в ряде других языков.
    На заметку Как вы, возможно, знаете, в некоторых языках, включая C/C++, строки реализованы в виде массивов символов. Однако в Java это не так. В действительности строки представляют собой объектные типы. Как будет показано позднее, поскольку в Java строки реализованы в виде объектов, язык предлагает множество мощных и простых в использовании средств их обработки.
    Переменные
    Переменная — основной компонент хранения данных в программе Java. Переменная определяется комбинацией идентификатора, типа и необязательного начального значения. Кроме того, все переменные имеют область видимости, которая задает их видимость для других объектов, и продолжительность существования. Мы рассмотрим эти элементы в последующих разделах.
    Объявление переменной
    В Java все переменные должны быть объявлены до их использования. Основная форма объявления переменных выглядит следующим образом.
    т и п
    идентификатор
    значение , идентификатор значение ...] Здесь тип — это один из элементарных типов Java либо имя класса или интерфейса. (Типы класса и интерфейса рассмотрены в последующих главах этой части) идентификатор —
    это имя переменной. Переменной можно присвоить начальное значение (инициализировать ее, указывая знак равенства и значение. Следует помнить, что выражение инициализации должно возвращать значение того же (или совместимого) типа, который указан для переменной. Для объявления нескольких переменных указанного типа можно использовать список, разделяемый запятыми

    8 Часть I. Язык Несколько примеров объявления переменных различных типов приведено ниже. Обратите внимание на то, что некоторые объявления осуществляют инициализацию переменных а, Ь, с
    / / объявление трех переменных типа int: аи се объявление еще трех переменных типа int с инициализацией d и f

    byte z = 22;
    // инициализация переменной z
    double pi = 3.14159;
    // объявление примерного значения переменной pi
    char х = 'х
    // присваивание значениях переменной х
    Выбранные имена идентификаторов очень просты и указывают их тип. Язык
    Java допускает применение любого правильно оформленного идентификатора с любым объявленным типом.
    Д инамическая инициализация
    Хотя в приведенных примерах в качестве начальных значений были использованы только константы, Java допускает динамическую инициализацию переменных с использованием любого выражения, допустимого в момент объявления переменной.
    Например, ниже приведена короткая программа, которая вычисляет длину гипотенузы прямоугольного треугольника по длинам катетов Этот пример демонстрирует динамическую инициализацию
    class Dynlnit {
    public static void main(String a r g s []) {
    double a = 3.0, b = 4.0;
    // динамическая инициализация переменной с
    double с = Math.sqrt(a * а + b * b) Гипотенуза равна " + с);
    }
    }
    Эта программа объявляет три локальные переменные — аи с. Две первые, аи Ь, инициализируются константами. Однако третья, с, инициализируется динамически, принимая значение длины гипотенузы (в соответствии с теоремой Пифагора. Для вычисления квадратного корня аргумента программа использует встроенный метод Java sqrt ()
    , который является членом класса
    Math. В этом примере основной момент состоит в том, что в выражении инициализации можно использовать любые элементы, которые допустимы вовремя инициализации, в том числе вызовы методов, другие переменные или константы.
    Область видимости и продолжительность существования переменных До сих пор все использованные в примерах переменные были объявлены вначале метода main ()
    . Однако Java допускает объявление переменных внутри любого блока. Как было сказано в главе 2, блок заключается в фигурные скобки. Он задает облаешь видимости. Таким образом, при открытии каждого нового блока мы создаем новую область видимости. Область видимости задает то, какие объекты видимы другим частям программы. Она определяет также продолжительность существования этих объектов.
    Многие другие языки программирования различают две основные категории области видимости глобальную и локальную. Однако эти традиционные области
    Глава 3. Типы данных, переменные и массивы видимости не очень хорошо вписываются в строгую объектно-ориентированную модель Java. Хотя глобальную область видимости и можно задать, в настоящее время такой подход является скорее исключением, нежели правилом. В Java имеется две основные области видимости — определяемые классом и методом. Но даже это разделение несколько искусственно. Однако поскольку область видимости класса обладает несколькими уникальными свойствами и атрибутами, неприменимыми к области видимости метода, такое разделение имеет определенный смысл. В связи с отличиями мы отложим рассмотрение области видимости класса (и объявленных внутри нее переменных) до главы 6, в которой описаны классы. А пока рассмотрим только те области видимости, которые определяются методом или внутри него.
    Определенная методом область видимости начинается сего открывающей фигурной скобки. Однако если данный метод обладает параметрами, они также включаются в область видимости метода. Хота подробнее параметры рассмотрены в главе 6, пока отметим, что они работают точно также, как любая другая переменная метода.
    Основное правило, которое следует запомнить переменные, объявленные внутри области видимости, невидны (те. недоступны) коду, который находится за пределами этой области. Таким образом, объявление переменной внутри области видимости ведет к ее локализации и защите от несанкционированного доступа и или изменений. Действительно, правила обработки области видимости — основа инкапсуляции.
    Области видимости могут быть вложенными. Например, при каждом создании блока кода мы создаем новую, вложенную, область видимости. В этих случаях внешняя область видимости заключает в себя внутреннюю область. Это означает, что объекты, объявленные во внешней области, будут видны коду, определенному во внутренней области. Тем не менее обратное неверно. Объекты, которые объявлены во внутренней области видимости, не будут видны за ее пределами.
    Чтобы понять эффект применения вложенных областей видимости, рассмотрим следующую программу Демонстрация области видимости блока
    class Scope {
    public static void main(String a r g s []) {
    int x; // эта переменная известна всему коду внутри методах начало новой области видимости у = 20; // известной только этому блоку их, и у известны в этой области видимости.
    System.out.println("х и уху) х = у * 2 ;
    }
    // у = 100; // Ошибка у неизвестна в этой области видимости переменная х известна и здесь.
    System.out.println("х равна " + х ) Как видно из комментариев, переменная х объявлена вначале области видимости метода m ain () и доступна всему последующему коду, находящемуся внутри этого метода. Объявление переменной у осуществляется внутри блока i f . Поскольку блок задает область видимости, переменная у видна только коду внутри этого блока. Именно поэтому строка у = 1 0 0 ;, расположенная вне этого блока, помещена в комментарий. Если удалить символ комментария, это приведет к ошибке времени компиляции, поскольку переменная у невидна за пределами своего блока. Переменную х можно ис­

    8 4 Часть I. Язык Java
    пользовать внутри блока
    if, поскольку код внутри блока (те. во вложенной области видимости) имеет доступ к переменным, которые объявлены внешней областью.
    Внутри блока переменные можно объявлять в любом месте, но они становятся допустимыми только после объявления. Таким образом, если переменная объявлена вначале метода, она доступна всему коду внутри этого метода. И наоборот, если переменная объявлена в конце блока, она, по сути, бесполезна, поскольку никакой код не получит к ней доступ. Например, следующий фрагмент кода неправилен, поскольку переменную c o u n t нельзя использовать до ее объявления Этот фрагмент неправилен = 100; // Стоп Переменную count нельзя использовать до того как она будет объявлена Следует запомнить еще один важный нюанс переменные создаются при входе в их область видимости и уничтожаются при выходе из нее. Это означает, что переменная утратит свое значение сразу по выходу из области видимости. Следовательно, переменные, которые объявлены внутри метода, не будут хранить свои значения между обращениями к этому методу. Кроме того, переменная, объявленная внутри блока, утратит свое значение по выходу из блока. Таким образом, продолжительность существования переменной ограничена ее областью видимости.
    Если объявление переменной содержит инициализацию, инициализация переменной будет повторяться при каждом вхождении в блок, в котором она объявлена. Например, рассмотрим приведенную ниже программу Демонстрация времени существования переменной
    class LifeTime {
    public static void main(String a r g s []) {
    int x;
    for(x = 0; x < 3; x++) {
    int у = -1; // у инициализируется при каждом вхождении
    // в блоку равна " + у // эта строка всегда выводит значение -у = у теперь равна " + у);
    }
    }
    }
    Эта программа создает следующий выводу равна -1
    у теперь равна 100

    .
    у равна -у теперь равна 100 у равна -1 у теперь равна Как видите, переменная у повторно инициализируется значением -1 при каждом вхождении во внутренний цикл f o r . Несмотря на то что впоследствии переменной присваивается значение 100, это значение теряется.
    И последнее хотя блоки могут быть вложенными, во внутреннем блоке нельзя объявлять переменные стем же именем, что и во внешней области. Например, следующая программа ошибочна Компиляция этой программы невозможна
    class ScopeErr {
    public static void m a m (String args [
    ] )
    {
    Глава 3. Типы данных, переменные и массивы 5
    int bar = 1;
    {
    1 1
    создание новой области видимости bar = 2; // Ошибка времени компиляции -
    // переменная bar уже определена!
    }
    }
    }
    Преобразование и приведение типов
    Те, кто уже обладает определенным опытом программирования, знают, что достаточно часто программисты присваивают переменной одного типа значение другого. Если оба типа совместимы, Java выполнит преобразование автоматически. Например, всегда можно присвоить значение типа int переменной типа long. Однако не все типы совместимы, и, следовательно, не все преобразования типов безоговорочно разрешены. Например, не существует никакого определенного автоматического преобразования типа double в тип byte. К счастью, преобразования между несовместимыми типами выполнять все-таки можно. Для этого необходимо использовать приведение типов, которое выполняет явное преобразование несовместимых типов. Рассмотрим автоматическое преобразование и приведение типов.
    Автоматическое преобразование типов в При присваивании данных переменной одного типа переменной другого типа выполняется автоматическое преобразования типа в случае удовлетворения следующих двух условий:
    • оба типа совместимы;
    • длина целевого типа больше длины исходного типа.
    При соблюдении этих условий выполняется преобразование с расширением Например, тип int всегда достаточно велик, чтобы хранить все допустимые значения типа byte, поэтому никакие операторы явного приведения типа не требуются.
    С точки зрения преобразования с расширением, числовые типы, среди которых целочисленный и с плавающей точкой, совместимы друг с другом. Однако не существует автоматических преобразований числовых типов в тип char или boolean. Типы char и boolean также несовместимы и между собой.
    Как уже говорилось ранее, Java выполняет автоматическое преобразование типов при сохранении целочисленной константы в переменных типа byte, short, long или Приведение несовместимых типов

    Хотя автоматическое преобразование типов удобно, оно не в состоянии удовлетворить все потребности. Например, что делать, если нужно присвоить значение типа int переменной типа byte? Это преобразование не будет выполняться автоматически, поскольку тип byte меньше типа int. Иногда этот вид преобразования называют преобразованием с сужением, поскольку значение явно сужается, чтобы оно могло уместиться в целевом типе

    1   2   3   4   5   6   7   8   9   ...   90


    написать администратору сайта