Типы данных и основы ООП Андрей Дмитриев Andrei.Dmitriev@Sun.COM Sun Microsystems Октябрь 2009.

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



Advertisements
Похожие презентации
Типы данных и основы ООП Андрей Дмитриев
Advertisements

Операции Условная операция ? : Если истинно, то результатом будет, иначе. Например, int x = a < b ? a : b вычисляет минимум из a и b.
Java. Part 2. Спецификаторы доступа public private protected не указан – доступ в пределах пакета Могут использоваться перед классами, методами, полями.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Лекция 30. Преобразования типов в C++ Красс Александр СПбГУ ИТМО, 2009.
Существует три разновидности комментариев: комментарии в одной строке, комментарии в нескольких строках, комментарии для документирования. Комментарии,
Переменные, величины Переменные, величины Типы, имена переменных Типы, имена переменных Хранение величин Хранение величин Переменные, величины Переменные,
Тип, имя и значение переменной.. Переменные. В объектно-ориентированных языках программирования, и в частности в языке Visual Basic, переменные играют.
Типы данных Инна Исаева. Переменные Переменная - это как ящик, в котором можно хранить данные. Каждая переменная имеет своё имя, она служит для хранения.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Основы информатики Лекция. Массивы. Указатели. Заикин Олег Сергеевич
Лекция 2 С => C++ => C# Большие и маленькие буквы различаются (main, Main, MAIN, mAin – разные имена) После каждого оператора ставится точка с запятой.
Лекция 2 Типы данных в Java Основные типы – простой и объектный.
Данные в программах и алгоритмах Программы и их алгоритмы пишутся для обработки данных. Чтобы реализовать алгоритм, программам необходимо работать с данными.
Тип, имя и значение переменной. В объектно-ориентированных языках программирования переменные играют такую же важную роль, как и в процедурных языках.
Статичні структури даних.. 2 Статические данные переменная (массив) имеет имя, по которому к ней можно обращаться размер заранее известен (задается при.
Лекция 1 по дисциплине «Программные средства математических расчетов» тема: «Основы языка С++» гр. 8Е31 Мамонова Татьяна Егоровна
Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Транксрипт:

Типы данных и основы ООП Андрей Дмитриев Sun Microsystems Октябрь 2009

2 Что такое тип данных?

3 Тип данных Спектр значений Набор допустимых операций

4 Программа Примитивные и ссылочные типы. Размеры данных. Преобразование и приведение типов. Массивы. Основы ООП.

5 Примитивные и ссылочные типы Язык Java является объектно-ориентированным, но существуют типы данных (простые/примитивные), не являющиеся объектами. > Фактор производительности. Простые типы делятся на 4 группы: > целые: int, byte, short, long > числа с плавающей точкой: float, double > символы: char > логические: boolean Введение в синтаксис языка классов позволяет создавать свои типы, получившие название ссылочных.

6 Примитивные типы DoubleIEEE754 64double Void---void FloatIEEE754 32float Long2^63-1-2^6364long Integer2^31-1-2^3132int Short2^15-1-2^1516short Byte byte CharacterU2^16-1Unicode 016char Boolean---boolean Класс- оболочка Максимальное значение Минимальное значение Размер(бит)Примитивный тип

7 Размер типа данных Размер одинаков для всех платформ; за счет этого становится возможной переносимость кода. Размер boolean не определен. Указано, что он может принимать значения true или false.

8 Значения по умолчанию 0.0ddouble 0.0ffloat 0Llong 0int (short)0short (byte)0byte '\u0000' (null)char falseboolean Значение по умолчанию Примитивный тип Неинициализированная явно переменная (член класса) примитивного типа принимает значение в момент создания:

9 Использование значения по умолчанию Значение по умолчанию может быть неразрешенным в конкретной программе. Рекомендуется присвоение значения в момент создания переменной: int i = 0; Неинициализированная локальная переменная – ошибка компиляции.

10 Классы-оболочки Часто переменные примитивных типов должны быть использованы к качестве объектов. Для каждого примитивного типа Java в пакете java.lang существует класс-оболочка: Long, Integer, Float,… Класс-оболочка – немодифицируемый класс char symbol = 'x'; Character symbol = new Character(c);

11 Числа с высокой точностью Предназначены для проведения расчетов без потери точности. Не имеют примитивных аналогов. BigInteger – для представления длинных целых чисел. BigDecimal – для представления больших чисел с плавающей точкой.

12 Приведение типов Приведение – это изменение типа (автоматическое или явное). Явное приведение позволяет : сделать тип преобразования более точным. форсировать преобразование, если оно не может быть выполнено автоматически.

13 Расширяющее преобразование int x = 200; long y = (long)x; long value = (long)200; //необязательно, т.к. компилятор делает это автоматически Результирующий тип имеет больший диапазон значений, чем исходный тип:

14 Сужающее преобразование long value = 1000L; int value2 = (int)value; //обязательно. Иногда это единственный способ сделать код компилируемым Результирующий тип имеет больший диапазон значений, чем исходный тип.

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

16 Литералы Литерал - это конкретное значение, присвоенное или использованное в выражении: //использование при присвоении int i1 = 0; char c = 2; //использование при сравнении if (c == 1) { //использование в бинарной операции i1 = i ; }

17 Литералы (cont.) // восьмеричное представление (ведущий ноль) int i3 = 0177; // суффикс для long long n1 = 200L; //рекомендуется пользоваться заглавной L long n2 = 200l; Для числовых типов можно указывать систему счисления и тип литерала. По умолчанию тип литерала – int.

18 Литералы (cont.) float f1 = 1; float f2 = 1F; // суффикс для float float f3 = 1f; // суффикс для float float f4 = 1e-45f; // 10 - основание степени double d1 = 1d; // суффикс для double double d2 = 1D; // суффикс для double double d3 = 47e47d; //10 - основание степени Для литералов чисел с плавающей точкой можно указывать тип литерала и задавать экспоненциальную запись числа.

19 Символы и кодировки Печатные символы можно записать в апострофах: ' а ', ' N ', ' ? '. Код любого символа с десятичной кодировкой от 0 до 255 можно задать, записав его не более чем тремя цифрами в восьмеричной системе счисления в апострофах после обратной наклонной черты: > ' \123 ' буква S, > ' \346 ' буква Ж в кодировке СР1251. > Наибольший код ' \377 ' десятичное число 255. Код любого символа в кодировке Unicode набирается в апострофах после обратной наклонной черты и латинской буквы u ровно четырьмя шестнадцатеричными цифрами: > ' \u0053 ' буква S, > ' \u0416 ' буква Ж.

20 Символы и кодировки (продолжение) Прописные русские буквы в кодировке Unicode занимают диапазон: > от ' \u0410 ' заглавная буква А, > до ' \u042F ' заглавная Я. Строчные буквы: > от ' \u0430 ' а, > до ' \044F ' я. В какой бы форме ни записывались символы, компилятор переводит их в Unicode, включая и исходный текст программы. Компилятор и исполняющая система Java работают только с кодировкой Unicode.

21 Управляющие символы Значение Код ASCII Запись символа апостроф' \' ' кавычка' \" ' обратная наклонная черта' \\ ' символ горизонтальной табуляции НТ' \t ' символ возврата на шаг BS' \b ' символ перевода страницы FF' \f ' символ возврата каретки CR' \r ' символ перевода строки newline' \n '

22 Ссылочные типы данных Программист имеет возможность создавать свои ссылочные типы. String s; //создание ссылки s = Hello; //присвоение значения String s1 = new String(World); Для большинства классов используется оператор new:

23 Константы Переменные с неизменяемыми значениями называются константами. final int MAXIMUM_SPEED = 250;

24 Операции Выделяют четыре типа: > арифметические, > поразрядные, > отношений, > логические.

25 Арифметические операции Остаток от деления% Инкремент.++ Декремент.-- Деление/ Умножение* Вычитание- Сложение+ Операнды должны иметь числовой тип. Можно использовать операции на типе char.

26 Поразрядные (bitwise) операции Действуют на индивидуальные биты. Применяются для числовых операндов. Сдвиг вправо>> Сдвиг влево<< Сдвиг вправо с заполнением старшего бита нулем >>> Исключающее ИЛИ^ ИЛИ| И& Отрицание~

27 Операции отношений Определяют отношения, которые один операнд имеет к другому. Больше или равно>= Меньше или равно<= Меньше< Больше> Не равно!= Равно==

28 Логические операции Работают только с типом boolean. Исключающее ИЛИ^ Не равно!= Троичная условная операция?: Равно== Отрицание! ИЛИ|| И&&

29 Размещение сущностей Переменная может быть размещена в одном из двух хранилищ: Стек – расположен в памяти VM и имеет поддержку в виде указателя стека. Куча (heap) – область памяти VM, в которой хранятся все ссылочные типы. Переменной простого типа выделяется память в стеке. Ссылки располагаются в куче.

30 Массивы Для хранения нескольких однотипных значений используется ссылочный тип – массив: //примитивный тип, размер массива задан явно int price[] = new int[10]; //неявное задание размера int rooms[] = new int[]{1, 2, 3}; //содержит ссылочные переменные Item [] items = new Item[10]; Item [] undefinedItems = new Item[]{ new Item(1), new Item(2), new Item(3)};

31 Доступ к элементам массива for (int i = 0; i < undefinedItems.length; i++){ // должен быть представим в виде // строки (переопределен метод // toString()) System.out.println(undefinedItems[i]); } Доступ осуществляется по индексу. Размер хранится в немодифицируемом поле массива length.

32 Многомерный массив Является массивом массивов. Многомерный массив концептуально представляет собой многомерную матрицу. int twoDim [][] = new int[4][5];

33 Массив массивов Каждый из массивов может иметь отличную от других длину. int twoDim [][] = new int[4][]; twoDim[0] = new int [10]; twoDim[1] = new int [20]; twoDim[2] = new int [30]; twoDim[3] = new int [100];

34 Ошибки времени выполнения public class Main { public static void main(String[] args) { int array [] = new int[]{1, 2, 3}; System.out.println(array[3]); } //попытка обратиться к несуществующему //индексу: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Main.main(Main.java:27) Обращение к несуществующему индексу массива отслеживается виртуальной машиной во время исполнения кода:

35 Ошибки времени выполнения (cont.) Object x[] = new String[3]; //попытка поместить в массив содержимое //несоответствующего типа x[0] = new Integer(0); Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer at Main.main(Main.java:22) Попытка поместить в массив неподходящий элемент пресекается виртуальной машиной:

36 Строки Класс java.lang.String представляет собой хранилище символов и функциональность для работы с ними. Строка имеет фиксированную длину и не завершается специальным символом. Возможности: > обращение к символу по его номеру, > поиск, > выделение подстроки, > изменение регистра, > и т.п. Объект класса String – неизменяем.

37 Основы ООП Инкапсуляция (сокрытие данных) - объединение в одной сущности данных и методов работы с ними. Наследование – возможность класса-наследника приобретать признаки класса-предка. Полиморфизм – способность наследников по- другому реализовывать возможности предков. Объект способен проявлять признаки своего предка.

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

39 Модификаторы доступа полей Нет модификатора – данное поле доступно отовсюду в данном пакете. public – поле доступно отовсюду. private - поле доступно только в данном классе. protected - поле доступно в данном классе и во всех его наследниках.

40 Полиморфизм class Animal { void talk(){…}; } class Dog extends Animal { void talk() { System.out.println("Woof!"); } } class Cat extends Animal { void talk() { System.out.println("Meow!"); } } Экземпляр класса может выступать как экземпляр любого класса-предка данного класса.

41 Полиморфизм (cont.) Animal myDog = new Dog(); Animal myCat = new Cat(); Экземпляр класса Dog или Cat одновременно является экземпляром класса Animal:

42 Отношения между классами Ассоциация. Наследование. Агрегация. Использование. Инстанцирование. Метакласс.

43 Ассоциация Ассоциация – это смысловая связь. Мощность ассоциации (количество участников): > "один-к-одному" > "один-ко-многим" > "многие-ко-многим".

44 Пример: товары и продажи class Product { protected Sale lastSale; } class Sale { protected Product productSold; } Класс Product - это то, что мы продали в некоторой сделке, а класс Sale - сама сделка, в которой продано несколько товаров. Данная ассоциация работает в обе стороны. Задавшись товаром, можно выйти на сделку, в которой он был продан, а пойдя от сделки, найти, что было продано.

45 Наследование Наследование - это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) или других классов (множественное наследование).

46 Ромбическое наследование abstract class Animal { abstract void talk(); } class Frog extends Animal { void jump() { //прыгать} } class Bird extends Animal { void fly() {//летать } } //ошибка, разрешено наследоваться только от одного класса. class FlyingFrog extends Frog, Bird{…} Класс не может приобретать свойства нескольких других классов через механизм наследования:

47 Ромбическое наследование (cont.) interface Flying { void fly(); } class Frog { void jump() { //прыгать} } class Bird implements Flying{ void fly() {//летать } } class FlyingFrog extends Frog implements Flying{…} //разрешено Для передачи свойств сразу от нескольких сущностей был введен новый тип данных – интерфейс. Использую дополнительную сущность, можно добиться того же результата как и при множественном наследовании:

48 Агрегация class TemperatureController { public TemperatureController(){}; private Heater header; } Физическое включение > Включение по значению (объект класса Heater не существует отдельно от объемлющего экземпляра класса TemperatureController). > Включение по ссылке (объекты живут отдельно друг от друга: мы можем создавать и уничтожать экземпляры классов независимо). Агрегация без физического включения > Например, акционер владеет акциями, но они не являются его физической частью.

49 Использование class TemperatureController { public TemperatureController() {} public MeasureResult process(TemperatureRamp ramp){ //Измеряем температуру и возвращаем результат }; Класс TemperatureRamp упомянут как часть сигнатуры метода process; это дает нам основания сказать, что класс TemperatureController пользуется услугами класса TemperatureRamp. Клиенты и серверы. Отношение использования между классами соответствует равноправной связи между их экземплярами. Это то, во что превращается ассоциация, если оказывается, что одна из ее сторон (клиент) пользуется услугами другой (сервера).

50 Инстанцирование Объекты intQueue и itemQueue - это экземпляры различных классов. Тем не менее, они получены из одного параметризованного класса Queue. Параметризованный класс не может иметь экземпляров, пока он не будет инстанцирован. Queue intQueue; Queue itemQueue;

51 Метакласс Любой объект является экземпляром какого-либо класса. Что будет, если мы попробуем и с самими классами обращаться как с объектами? Для этого нам надо ответить на вопрос, что же такое класс класса? Ответ - это метакласс. Иными словами, метакласс - это класс, экземпляры которого суть классы. Метаклассы венчают объектную модель в чисто объектно-ориентированных языках.

52 Почему композиция? Композиция объектов в некоторых случаях позволяет незначительными усилиями добиться результата, аналогичного тому, что можно получить при наследовании.

53 Композиция (cont.) class Fax { void send(){ doGood(); doBad(); } void doBad(){…} } Предположим, что класс Fax выполняет некоторое действие неправильно (метод Fax.doBad()).

54 Композиция (cont.) Если данный метод doBad()реализован в классе Fax, то можно сделать так: class NewFax extends Fax { void send(){ doGood(); doBad(); } void doBad(){ //делаем то же самое, но правильно; }

55 Композиция (cont.) class BetterFax { private Fax fax = …; void send(){ fax.doGood(); doBad_Fixed(); } … } Того же можно добиться, если поместить класс Fax внутрь другого класса:

56 Тест Может ли конструктор класса быть помеченным модификатором private? Можно ли значение переданного в метод параметра модифицировать так, что бы изменилось его значение в контексте вызывающего метода?

57 Правда ли что… В Java нет специальных обозначений для бинарного представления литералов, например : int t = B; Литерал 47e47d имеет значение 47*10^47 и имеет тип double? char может хранить символы в Unicode формате? Композиция объектов лучше, чем наследование?

58 Ссылки Ekkel B. Thinking in Java

Q&A

Типы данных и основы ООП Андрей Дмитриев Sun Microsystems Октябрь 2009