Массивы (1) Массивы в языке Java относятся к ссылочным типам и определяются способом, характерным для ссылочных типов. Полное определение включает три.

Презентация:



Advertisements
Похожие презентации
Типы данных Инна Исаева. Переменные Переменная - это как ящик, в котором можно хранить данные. Каждая переменная имеет своё имя, она служит для хранения.
Advertisements

Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
1 Контрольное зачетное задание (0, 0)(0, m-1) (n-1, 0)(n-1, m-1) Дано прямоугольное поле, расчерченное на клетки: n клеток в высоту и m клеток в ширину.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
1 Методы Java Методы класса – это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне,
Лекция 2 Наследование Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends.
Java. Part 2. Спецификаторы доступа public private protected не указан – доступ в пределах пакета Могут использоваться перед классами, методами, полями.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
1 Обработка исключений в Java Одно из важнейших преимуществ Java – разработанный на уровне языка механизм обработки исключений. Исключение в Java - это.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
АССОЦИАТИВНЫЕ КОЛЛЕКЦИИ Лекция 6 1. Отличие от последовательных 2 В последовательной коллекции каждый элемент ассоциируется с номером, начиная с 0. В.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Транксрипт:

Массивы (1) Массивы в языке Java относятся к ссылочным типам и определяются способом, характерным для ссылочных типов. Полное определение включает три составных части. Объявление. Содержит имя типа элементов массива, сопровождаемое парами квадратных скобок, и имя переменной (скобки могут быть указаны при имени переменной): double[ ] currentBalance; String methodArgs[ ]; TailPosition[ ] tailPositions[ ]; // так объявлять массивы можно, но не рекомендуется float airPressure[ ][ ][ ]; Создание. Выполняется явно или неявно вызываемой операцией new, которая создает экземпляр специального класса, выделяет для него участок памяти нужного размера, инициализирует все элементы массива стандартным начальным значением для заданного типа элементов и возвращает указатель на экземпляр: currentBalance = new double[ 10 ]; methodArgs = new String[ argsCount ]; tailPosition = new TailPosition[ rows ][ columns ]; airPressure = new float[ domainWidth ][ domainLength ][ MAX_HEIGHT ]; Объявление и создание массивов могут быть объединены: double[ ] currentBalance = new double[ 10 ]; String[ ] methodArgs = new String[ argsCount ]; TailPosition[ ] tailPosition[ ] = new TailPosition[ rows ][ columns ]; float[ ][ ][ ] airPressure = new float[ domainWidth ][ domainHeight ][ 10 ];

Массивы (2) При создании многомерного массива обязательно указывать только значение самой левой (или нескольких левых) границы изменения индексов: int arrayOfTerms[ ][ ][ ] = new int[ 10 ][ ][ ];// допустимо, можно и [ 10 ][ 12 ][ ]; int arrayOfTerms[ ][ ][ ] = new int[ 10 ][ ][ 12 ];// не допустимо!!! Неявный вызов операции new может выполняться при определении массива с использованием третьей составной части - инициализации. Инициализация. Установка начальных значений элементов массива, отличающихся от стандартных, может быть выполнена так: double[ ] currentBalance = new double[ ] { -1.2, 5.27, 0, 0.7, 252, 18.1, 22, 3.64, 0, 99.73}; Или так: double[ ] currentBalance = { -1.2, , 0, , 252, , 22, , 0, 0}; Важно помнить, что любые операции инициализации выполняются не компилятором, а виртуальной машиной. Соответственно, и первая и вторая приведенная здесь инициализация на самом деле компилятором превращается в такую последовательность операторов: double[ ] currentBalance = new double[ 10 ]; currentBalance[0] = -1.2; currentBalance[1] = 5.27; … currentBalance[9] = 99.73; Создание с инициализацией, но без объявления, может быть использовано для передачи безымянного массива в качестве аргумента метода, например: int response = alert.askQuestion( "Сохранить файл?", new String[ ] { "Yes", "No"});

Массивы (3) Однажды созданный массив нельзя уменьшить или увеличить в размерах. Можно создать другой массив и «перещелкнуть» ссылку на него: currentBalance = new double[ 12 ]; // предыдущий массив становится мусором Любой массив всегда содержит целочисленную константу length. Оператор: System.out.println( currentBalance.length ); выведет на консоль значение 12. Нумерация элементов массива ведется с 0. Виртуальная машина контролирует значения индексов при любом доступе к массиву. В случае выхода индекса за пределы диапазона 0 – (length-1) выбрасывается непроверяемое исключение java.lang.ArrayIndexOutofBoundsException. Многомерные массивы в Java на самом деле являются одномерными массивами, элементы которых содержат экземпляры специального класса-массива меньшей размерности. Поэтому многомерные массивы не обязательно должны быть прямоугольными. Например, можно создать массив «таблица умножения»: int[ ][ ] multiplicaionTable = { { 0 }, { 0, 1 }, { 0, 2, 4 }, { 0, 3, 6, 9 }, … };

Массивы (4) Можно и по другому (без инициализации) определить ступенчатый массив. Пусть, например, требуется создать двумерный массив, вектора которого имеют размер, равный числам Фибоначчи, начиная с 4-го. int prevFiboNumber = 1; int currFiboNumber = 2; int[ ][ ] stairArray = new int[ MAX_FIBO_COUNT ] [ ]; for( int i = 0; i < MAX_FIBO_COUNT; i += 1) { stairArray[ i ] = new int[ currFiboNumber ]; currFiboNumber += prevFiboNumber; prevFiboNumber = currFiboNumber – prevFiboNumber; } Существуют и другие способы хранения и обработки совокупностей однотипных значений (списки, множества, словари, …), но массивы отличаются от них: более высокой эффективностью (следствие этого – невозможность динамического изменения размера); типизацией, обеспечивающей выполнение большинства проверок на этапе компиляции; возможностью хранения значений примитивного типа. Тем не менее, вместо массивов рекомендуется использовать параметризованные контейнеры из пакета java.util, такие как ArrayList, LinkedList и другие.

Платформа Java Базовые пакеты. Пакет java (1) НазваниеНазначение java.appletБазовый пакет для создания апплетов (приложений, загружаемых из веб- сервера и исполняемых в "песочнице" браузера). java.awtБазовый пакет работы с графическим пользовательским интерфейсом (Abstract Window Toolkit - Абстрактный Инструментарий графического Окна). java.awt.*Набор подпакетов, дополняющих библиотеку AWT средствами работы с цветом, событиями, имиджами, … java.beansПоддержка компонентной модели JavaBeans. java.ioБазовые средства ввода-вывода. java.langБазовые классы языка Java. Пакет автоматически импортируется в любую программу без директивы импорта. java.lang.reflectПоддерживает механизм доступа к классам как метаобъектам, обеспечивает средства для динамического выяснения программой, какие возможности поддерживает класс. Данный механизм называется reflection - "отражение". java.lang.*Другие подпакеты, расширяющие функциональность базового пакета java.lang (аннотации, инструментация, поддержка динамических средств вызова методов, …).

Платформа Java Базовые пакеты. Пакет java (2) java.mathПоддержка вычислений с целыми числами произвольной длины, а также с числами в формате с плавающей точкой произвольной точности (не следует путать с классом java.lang.Math). java.netПоддержка работы в Интернет, а также соединений через сокеты (sockets). java.nioСодержит классы и пакеты для поддержки сетевых соединений, расширяющие возможности пакета java.io и классы контейнеров (буферов) для создания списков с данными различных примитивных типов, а также. java.nio.*Cодержит подпакеты channels ("каналы соединения, коннекции"), charset ("национальный набор символов") и file ("доступ к файловой системе"). Пакет charset обеспечивает поддержку перекодирования из символов Unicode в последовательность байт для передачи через канал связи, а также обратное преобразование. java.rmi и java.rmi.* Поддержка вызовов удаленных методов. java.security и java.security.* Поддержка специальных средств, обеспечивающих безопасность приложения, в том числе при работе в компьютерных сетях (списки доступа, сертификаты безопасности, шифрование и т.д.). java.sqlПоддержка SQL-запросов к базам данных.

Платформа Java Базовые пакеты. Пакет java (3) java.text и java.text.spi Поддержка специальных средств, обеспечивающих локализацию программ – классы, обеспечивающие настройки для работы с текстом, датами, текстовым представлением чисел. Кроме того, содержит средства для зависимого от локализации сравнения строк. java.utilСодержит важнейшие классы для работы со структурами данных (в том числе – необходимых для работы с событиями и датами). В частности – поддержку работы с массивами (сортировка, поиск), а также расширенные средства генерации псевдослучайных чисел. java.util.jarПоддержка работы с jar-архивами (базовым видом архивов в Java). java.util.zipПоддержка работы с zip-архивами. java.util.regexПоддержка работы с регулярными выражениями (поиск и замена в строках) java.util.* Другие расширения функциональности пакета java.util (поддержка средств взаимодействия потоков, критических секций, атомарных операций, семафоров, средства ведения лог-файлов, …)

Платформа Java Базовые пакеты. Пакет javax (1) javax.accessibilityОбеспечивает настройку специальных возможностей представления информации для людей с плохим зрением, слухом и т.п., а также других случаев, когда требуется специализированный доступ для управления информационными объектами. javax.activityВспомогательный пакет для работы с компонентами. javax.annotation и javax.annotation.* Средства работы с аннотациями (метаданными, не преобразуемыми в байт-код, но влияющими на компоненты, обрабатывающие программу – текстовый редактор, компилятор, …) javax.crypto и javax.crypto.* Поддержка шифрования-расшифровки данных. javax.imageioПоддержка работы с изображениями (ввод-вывод). javax.jws и javax.jws.soap Аннотации для приложений, развертываемых в Интернете и/или через Интернет javax.lang.model и javax.lang.model.* Расширенные средства поддержки рефлексии

Платформа Java Базовые пакеты. Пакет javax (2) javax.management и javax.management.* Поддержка работы с управляющими компонентами (MBean – Management Bean). javax.naming и javax.naming.* Поддержка работы с пространствами имен компонентов. javax.net и javax.net.ssl Расширение возможностей java.net: поддержка работы в Интернет, а также безопасных соединений через сокеты (sockets). javax.print и javax.print.* Поддержка работы с печатью документов. javax.rmi и javax.rmi.* Расширение возможностей java.rmi: поддержка вызовов удаленных методов, в том числе – через безопасные соединения. javax.scriptОбеспечение взаимодействия с интерпретаторами скриптовых языков (такими, как JavaScript)

Платформа Java Базовые пакеты. Пакет javax (3) javax.security и javax.security.* Расширение возможностей пакета java.security: поддержка специальных средств, обеспечивающих безопасность приложения. javax.sound и javax.sound.* Поддержка работы со звуковыми потоками и файлами. javax.sql и javax.sql.* Поддержка SQL-запросов к базам данных. – Расширение возможностей java.sql javax.swing и javax.swing.* Библиотека основных графических компонентов в Java 2. javax.transactionПоддержка работы с распределенными транзакциями. javax.xml и javax.xml.* Поддержка работы с XML документами и парсерами.

Платформа Java Пакеты сообществ разработчиков org.ietfПоддержка защищенных соединений по протоколу GSS (Kerberos v5 ). org.omg.*Средства для использования из программ на Java технологии CORBA, и другие средства создания распределенных объектных приложений. org.w3c.dom.*Интерфейсы для работы с XML-документами в соответствии со спецификацией DOM. org.xml.sax.*Поддержка упрощенной работы с XML-документами. …

Пакет java.lang Класс Object (1) Класс Object является базовым для всех остальных классов. Методы, определенные в нем, наследуются или замещаются любым другим классом. Метод public final native Class getClass( ) возвращает объект типа Class, который будет детально рассмотрен немного позже. Метод public boolean equals( Object obj ) определяет, являются ли объекты одинаковыми. Если операция == проверяет равенство по ссылке (указывают на один и тот же объект), то метод equals( ) – равенство по значению (состояния объектов одинаковы). Поскольку класс Object не содержит полей, реализация в нем этого метода такова, что значение true будет возвращено только в случае равенства по ссылке, то есть: public boolean equals( Object obj ) { return ( this == obj ); } Во всех остальных классах этот метод может (но не обязательно должен) быть переопределен для того, чтобы сравнивать состояния экземпляров (и, возможно, типов). Вот, например, реализация этого метода для класса java.lang.Integer: public boolean equals( Object obj ) { if ( obj instanceof Integer ) { return value == ( ( Integer )obj ).intValue( ); } return false; }

Пакет java.lang Класс Object (2) Метод equals() может быть переопределен любым способом. Однако существуют соглашения, которые необходимо соблюдать для того, чтобы класс вел себя предсказуемым с точки зрения других программистов образом: рефлексивность: для любой объектной ссылки x, отличной от null, вызов x.equals(x) должен возвращать true; симметричность: для любых объектных ссылок x и y, вызов x.equals( y ) должен возвращать то же самое значение, что и вызов y.equals( x ); транзитивность: для любых объектных ссылок x, y и z (ссылка x не совпадает со ссылкой z: x != z ), если x.equals( y ) возвращает true (false) и y.equals( z ) возвращает true (false), то вызов x.equals( z ) должен вернуть true (false); непротиворечивость: для любых объектных ссылок x и y многократные последовательные вызовы x.equals( y ) в однопоточной программе должны возвращать одно и то же значение (либо всегда true, либо всегда false); для любой не равной null объектной ссылки x вызов x.equals(null) должен вернуть значение false. Большинство стандартных классов JDK переопределяет этот метод, строго следуя всем соглашениям. Метод public int hashCode( ) – выдает хэш-код объекта. Хэш-кодом называется условно уникальный (в пределах приложения) числовой идентификатор, сопоставляемый каждому экземпляру любого класса. Если метод не замещен, то хэш-код, возвращаемый классом Object, вычисляется нативной функцией из адреса объекта. Это нужно для случаев, когда надо хранить таблицы адресов объектов (однако из соображений безопасности сообщать кому бы то ни было точные адреса объектов нельзя).

Пакет java.lang Класс Object (3) Для метода hashCode( ) также принят ряд соглашений, которым стоит следовать при переопределении: если два объекта идентичны, то есть вызов метода object1.equals( object2 ) возвращает true, то вызов метода hashCode( ) у каждого из этих двух объектов должен возвращать одно и то же значение (следовательно, если замещается метод equals( ), то необходимо замещать и метод hashCode( )); во время одного запуска программы для одного объекта при вызове метода hashCode( ) должно возвращаться одно и то же значение, если между этими вызовами не были изменены данные, используемые для проверки объектов на идентичность в методе equals(). Это значение не обязательно должно быть одним и тем же при повторном запуске программы, даже если все данные будут идентичны. Метод public String toString( ) возвращает строковое представление объекта. В классе Object этот метод реализован следующим образом: public String toString( ) { return getClass( ).getName( ) + + Integer.toHexString( hashCode( ) ); } Возвращает строку, содержащую название класса объекта и его хеш-код в шестнадцатеричном формате. В классах-наследниках этот метод может быть замещен для получения более наглядного описания объекта. Обычно этим методом возвращается конкатенация значений важнейших полей, характеризующих данный экземпляр. В большинстве стандартных классов этот метод замещен. Например, экземпляры класса String просто возвращают ссылку на самих себя (this).

Пакет java.lang Класс Object (4) Метод protected native Object clone( ) throws CloneNotSupportedException выполняет копирование объекта и возвращает ссылку на созданный клон (дубликат) объекта. Если в классе-наследнике этот метод не замещается, то попытка его вызова вызывает возбуждение исключения CloneNotSupportedException ("Клонирование не поддерживается"). Если же клонирование нужно обеспечить, то этот метод надо обязательно заместить и указать, что класс реализует интерфейс Cloneable. Различается два вида клонирования: мелкое ( shallow ), когда в клон один к одному копируются все значения полей оригинального объекта; глубокое ( deep ), при котором для полей ссылочного типа клонируются все те объекты, на которые ссылаются поля оригинала; в эти поля заносятся ссылки на вновь созданные клоны. При мелком клонировании и оригинал, и клон будут ссылаться на одни и те же объекты. Если объект имеет поля только примитивных типов, различия между мелким и глубоким клонированием нет. На этапе разработки класса следует решить, нужно ли клонирование и если нужно, то какой вариант клонирования должен быть реализован. В подавляющем большинстве случаев замещения метода требуется глубокое клонирование. Методы wait( ), notify( ), notifyAll( ) используются для поддержки многопоточности и будут подробно рассмотрены позже. Все они определены как public final native void и не могут быть замещены в классах-наследниках. Метод protected void finalize( ) throws Throwable уже обсуждался.

Пакет java.lang Класс Class (1) В запущенной Java-программе каждому загруженному классу соответствует объект (экземпляр) типа Class. Этот объект содержит информацию, определяющую сам класс – его поля, методы, конструкторы и т.д. Класс Class не имеет открытого конструктора, объекты этого класса создаются автоматически виртуальной машиной по мере загрузки описаний классов из class-файлов. Тем не менее, получить экземпляр объекта Class для любого конкретного класса можно с помощью статического метода forName(): public static Class.forName( String name, boolean initialize, ClassLoader loader ) Этот метод возвращает объект Class, соответствующий классу, или интерфейсу, с названием, указанным в аргументе name (необходимо указывать полное название класса или интерфейса), фактически созданный загрузчиком классов, переданным в аргументе loader. Если в качестве загрузчика классов loader указано значение null, будет взят тот ClassLoader, который применялся для загрузки вызывающего класса. При этом класс будет инициализирован, только если значение аргумента initialize равно true и класс не был инициализирован ранее. Есть перегруженный вариант этого метода: public static Class.forName( String className ), для которого считается initialize = true и loader = null. Например: Class varClass = Class.forName( "String" ); Точно такой же результат можно получить, используя синтаксис: Class varClass = java.lang.String.class; И еще один вариант: Class varClass = "".getClass( );

Пакет java.lang Класс Class (2) Метод public Object newInstance( ) создает и возвращает объект класса (даже если для этого класса нельзя использовать операцию new), который определяется данным экземпляром класса Class. Создание объекта будет выполняться с использованием конструктора без параметров. Если такового в классе нет, или объект Class соответствует абстрактному классу или интерфейсу, или еще какая-то другая причина помешала созданию нового объекта, то будет выброшено исключение InstantiationException. Object classTest = null; Object instanceTest = null; try{ classTest = Class.forName( "java.lang.String" ); instanceTest = ( ( Class )classTest ).newInstance( ); } catch( Exception e ){ System.out.println( e.toString( ) ); } System.out.println( "class: " + classTest.getClass + " instanceClass: " + instanceTest ); Результат: class: class java.lang.Class instanceClass: java.lang.String То же самое увидим, заменив первую строку блока try на: classTest = java.lang.String.class; И на: classTest = "".getClass();