Андрей Дмитриев Sun Microsystems Октябрь 2009 Основы синтаксиса языка Java.

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



Advertisements
Похожие презентации
Андрей Дмитриев 2008 Основы синтаксиса языка Java.
Advertisements

Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Встроенные классы в Java Макаревич Л. Г.. Разновидности встроенных классов Вложенные (Nested) классы Внутренние (Inner) классы Локальные классы Анонимные.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП) 1.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Объектно-ориентированный подход в языке C#. Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
1 Методы Java Методы класса – это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне,
Транксрипт:

Андрей Дмитриев Sun Microsystems Октябрь 2009 Основы синтаксиса языка Java

2 Программа Зарезервированные слова. Операторы. Рекомендации по оформлению. Время жизни и области видимости. Модификаторы доступа. Вызовы методов. Конструктор. Статический блок. Повторное использование имен. Внутренние классы. Интерфейсы Aбстрактные классы. Константы.

3 Основы: программа DragonWorld package heroes; public class HelloDragonWorld { public static void main(String []args){ System.out.println(Hello DragonWorld!); }

4 Основы: пакет Пакет – это совокупность классов и под пакетов, объединенных общим именем. package mydragons; public class Dragon{//реализация } //использование import mydragons.Dragon; Dragon red = new Dragon(Dragon.RED); Dragon black = new mydragons.Dragon(Dragon.BLACK);

5 Основы: класс Класс – это базовая сущность ООП, обладающая определенными свойствами. Любая программа на языке Java представляет собой класс. package animals.slowanimals; public class Reptile { public void eat(Bird b){ b.wasEaten = true; }

6 Основы: поле Поле – это именованное свойство класса или объекта. Поле может относиться как к каждому объекту, так и к классу в целом. package animals.slowanimals; public class Reptile { private int length; }

7 Основы: объект Объект – это переменная, типом которой является соответствующий класс. Объект также называют экземпляром класса. package animals.slowanimals; //класс: public class Reptile { private int length; } … //объект: Reptile gecko = new Reptile();

8 Основы: метод package animals.slowanimals; public class Reptile { private int length; public void eat(Bird b){ length++; } Метод – это программная функция, относящаяся к определенному объекту или классу. Области, откуда метод может быть доступен, определяются модификаторами метода.

9 Основы: наследование // наследование производится с помощью // ключевого слова extends public class Dragon extends Reptile { //внутреннее поле класса private String magic = fire; public String getMagic(){ //возврат результата return fire; } Класс может заимствовать методы другого класса. Язык Java поддерживает операцию наследования:

10 Область видимости переменной int i = 10; //область видимости ограничится //ближайшими фигурными скобками. System.out.println(i); for (int j = 0; j < 100; j++){ // j видна внутри блока for System.out.println(j); } //i видна после блока for System.out.println(i); //j: переменная вне области видимости - ошибка System.out.println(j); Каждая переменная может быть использована только в ее области видимости.

11 Модификаторы Модификаторы доступа являются реализацией принципа инкапсуляции в языке Java. Изменяя модификаторы, можно контролировать область видимости полей методов классов

12 Модификаторы полей Поле доступно только из текущего пакета. отсутствие модификатора Поле доступно отовсюду.public Поле не может быть использовано нигде кроме данного пакета и в наследниках. protected Поле не может быть использовано нигде кроме данного класса или его экземпляра. private

13 Модификаторы полей (cont.) Поле не участвует в процессе сериализации (сохранение состояния объекта во внешнюю память) по умолчанию. transient Поле не может быть изменено.final Поле принадлежит структуре класса. Одно значение присуще всем экземплярам.. static Значение этого поля будет обновляться каждый раз при обращении к нему. Обычно используется при параллельном исполнении программы. volatile

14 Модификаторы методов Метод доступен только из данного пакета. отсутствие модификатора Метод доступен из любого пакета (публичный API). public Метод не может быть использован ниоткуда кроме данного класса (его объекта), текущего пакета и всех его наследников (их объектов). protected Метод не может быть использован ниоткуда кроме данного класса (его объекта). private

15 Модификаторы методов (cont.) Запрещено одновременное выполнение метода на разных потоках. synchronized Метод имеет реализацию на языке C или С++. native Метод не имеет реализации.abstract Метод принадлежит классу.static Метод не может быть переопределен в наследнике. final

16 Модификаторы классов Класс является абстрактным, нельзя создать объект этого класса. abstract Допустимо только для вложенных классов. Внутренний класс является статическим членом внешнего класса. static Класс не может расширяться с помощью наследования. final Класс доступен из любого пакета (публичный API). public Класс доступен только в текущем пакете. отсутствие модификатора

17 Конструктор public class Dragon{ private String color = gold; public Dragon(String newColor){ color = newColor; } Конструктор – это метод, создающий экземпляр класса. Не имеет заданного возвращаемого значения. Имеет то же имя, что и класс.

18 Конструктор по умолчанию В классе всегда присутствует конструктор по умолчанию, если явно конструктор не задан. public class Dragon { private String color; public String getColor () { return color; } //вызывается конструктор по умолчанию Dragon dragon = new Dragon();

19 Вызов конструктора предка При вызове конструктора класса происходит предварительный вызов конструктора предка. Этот вызов неявный, если не указано обратное.

20 Вызов метода Вызов метода – это обращение к члену класса по его имени. Результат вызова метода – выполненные операторы и возвращаемое значение (если указано). public class Dragon{ private String name = Kesha; public String getName (){ return I am+name; } Dragon dragon = new Dragon(); //конструктор System.out.println(dragon.getName()); //метод

21 Возвращаемое значение Метод может возвращать одно значение (может быть простой тип, ссылочный тип, массив) в точку вызова. Если метод не возвращает никакого значения, то его возвращаемый тип – void. public void dumpValue (){ System.out.println(value = + value); }

22 Виртуальный метод Виртуальным называется метод, который замещает собой соответствующий метод предка, если метод вызывается для потомка. > Метод класса может быть переопределен в наследнике. > Конкретная реализация метода для вызова будет определяться во время исполнения. > Процесс по определению того метода, который следует вызывать называется диспатчем (dispatch). Виртуальность – связывание класса с его методами на этапе создания объекта.

23 Повторное использование имен (переопределение) class Reptile{ public void move(){/*ползти*/ } } class Dragon extends Reptile{ public void move(){/*лететь*/} } Dragon d = new Dragon(); d.move(); //обращение к методу экземпляра Dragon Reptile r = new Reptile(); r.move(); //обращение к методу экземпляра Reptile Методы предка и наследника могут быть одноименными.

24 Повторное использование имен (сокрытие) class Reptile{ public static void move(){} } class Dragon extends Reptile{ public static void move(){} } Dragon d = new Dragon(); Reptile r = new Reptile(); d.move(); //обращение к методу Dragon r.move(); //обращение к методу Reptile //Рекомендуется использовать вызовы класса: Reptile.move(); Dragon.move(); Reptile r1 = new Dragon(); //что выведет r1.move();? Статические методы принадлежат классу.

25 Повторное использование имен (перегрузка) class HungryDragon { public void eat(int foodWeight){…} public void eat(String foodWeight){ //разбор строки на значимое целое число int i = Integer.parseInt( foodWeight ); … //что бы вы поставили сюда? } HungryDragon hd = new HungryDragon (); hd.eat(10); Методы выполняют схожую функцию над разными типами данных.

26 Повторное использование имен (затенение) Локальная переменная делает одноименную глобальную переменную невидимой в локальной области. Так делать не рекомендуется. public class Dragon { static String type = Just Dragon"; public static void main(String [] s){ String type = Black Dragon"; //выведет Black Dragon" System.out.println(type); }

27 Повторное использование имен (перекрытие) public class BadExample { static String System; public static void main(String [] s){ System.out.println(A string"); } Использование имен существующих методов и полей вносит в программу путаницу. Использование существующих имен классов недопустимо. Результат работы программы: BadExample.java:4: cannot resolve symbol symbol : variable out location: class java.lang.String System.out.println("A string");

28 Правила оформления Основная цель хорошего оформления программы – она должна выглядеть понятной. Среди требований можно отметить: Отступы. Мнемоничность имен. Разделение операторов. Использование фигурных скобок. И т.д. Рекомендации от компании Sun Microsystems:

29 Пример оформления /* * Discipline.java * Дисциплина - курс с определенным названием, лектором и годом (семестром). * Created on 7 Апрель 2007 г., 15:12 * */ package disc; import java.util.*; /** Mark */ public class Discipline {

30 Пример оформления (cont.) private int id; //уникальный ID private String name = "?"; //название курса private String lector = "?"; //лектор, ведущий курс private String year = "?"; //год (семестр), когда читался private String annotation; //краткая аннотация private int numberOfLectures; //количество лекций private int numberOfPractices; //количество практик private int numberOfTeorWorks; //количество теоретических работ private ArrayList pwList = new ArrayList(); //список заданий на практики

31 Пример оформления (cont.) /** Creates a new instance of Course */ public Discipline() { } public Discipline(String name, String lector, String year) { this.name = name; this.lector = lector; this.year = year; } //далее методы get и set public int getId() { return id; } public void setId(int id) { this.id = id; }

32 Пример оформления (cont.) /** Получаем дисциплину из списка по ее ID; если в * списке нет, возвращаем "пустую"*/ public Discipline disciplineByID(int id){ for (int i=0; i < this.getSize(); i++) { if (get(i).getId() == id) { return get(i); } Discipline nullDisc = new Discipline(); return nullDisc; }

33 Пример неправильного оформления private void intvlTo(String v, int t) { if (v==null) throw new NullPointerException(Er"); array.insertElementAt(v, t); ChoicePeer peer = (ChoicePeer)this.peer; if (peer != null) { peer.addItem(v); } if (selectedIndex < 0 // no selection or selection shifted up || selectedIndex >= t) { select(0); }

34 Пример неправильного оформления (cont.) private void removeNoInvalidate(int position){ pItems.removeElementAt(position); ChoicePeer peer = (ChoicePeer)this.peer; /*Similar line in method getValue() does the same. */ if (pItems.size() == 0){ selectedIndex = -1;} if ((mask & ITEM_EVENT_MASK)!= 0 || itemListener != null) { return true; }

35 Передача параметров Метод класса может получать до 255 параметров. Фактический параметр считается локальной переменной метода. class Dragon { public void eat(Object obj){} public void fly(String direction){} } Dragon d = new Dragon(); d.eat(new Girl()); d.fly(Direction.WEST);

36 Виртуальность вызова методов class Reptile{ public void move(){} //ползти } class Dragon extends Reptile{ public void move(){} //лететь } … Reptile r = new Reptile(); Dragon d = new Dragon(); r.move(); //обращение к экземпляру Reptile-ползет d.move(); //обращение к экземпляру Dragon -летит!

37 Поле this class Dragon { private int weight; public Dragon(int weight){ //затенение this.weight = weight; } Каждый объект имеет ссылку на самого себя. Может использоваться для формирования ссылки на перегруженный конструктор и на поля объекта.

38 Поле super Каждый объект имеет ссылку на объект-предок. Позволяет организовать восходящие вызовы конструкторов. class NamedDragon extends Dragon { private String name; public NamedDragon(int weight, int name){ //обращение к конструктору класса Dragon, // который умеет инициализировать объект // его весом super(weight); this.name = name; }

39 Поле super (cont.) class Dragon extends Reptile{ int flyingSpeed; public void attack(Object obj){ //обращение к предку за выполнением //базовых действий super.attack(obj); burn(obj); //метод класса Dragon } // Dragon умеет атаковать, как Reptile, // а заодно сжигать жертву public void burn(Object obj){ //сжечь объект } С помощью данного поля можно вызывать методы предка.

40 Статический блок class Dragon { //статический блок выполняется до того, как создался первый экземпляр класса static { System.out.println(Dragons are alive!); } //конструктор может не выполниться ни разу //В то время как статический инициализатор //выполнится при загрузке public Dragon(){ System.out.println(New dragon has born); } Класс может иметь в себе участок кода, выполняющийся при инициализации класса.

41 Порядок инициализации class Dragon { static int dragonCount = 10; static { //ошибка - переменная dragonEnemy еще не проинициализирована System.out.println(dragonEnemy); //ОК - переменная dragonCount уже проинициализирована System.out.println(dragonCount); } static String dragonEnemy = Phoenix; } Инициализация членов класса и выполнение статического инициализатора происходит в порядке их описания в классе.

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

43 Внутренние классы (cont.) public class DragonFlying { class Speed { //внутренний класс private int i = 100; public int value(){ return i; } } class Destination {//внутренний класс private String label; Destination(String whereTo){ label = whereTo; } String readLabel(){ return label;} } Тело внутреннего класса содержится в теле другого класса.

44 Внутренние классы (cont.) public void ship(String dest){ Speed s = new Speed(); Destination d = new Destination(dest); System.out.println(d.readLabel()); } public static void main(String[] args) { DragonFlying f1 = new DragonFlying (); f1.ship("Tanzania"); } Внешний класс имеет доступ ко внутренним и может создавать его экземпляры.

45 Внутренние классы (cont.) public Destination to(String s) {//может быть возвращен внутренний класс return new Destination(s); } public Speed speed() { return new Speed(); } DragonFlying f = new DragonFlying(); DragonFlying.Speed s = f.speed(); //используется префикс содержащего класса DragonFlying.Destination d = f.to("Borneo"); Внутренний класс может быть доступен и снаружи.

46 Типичное использование внутреннего класса public interface Destination { String readLabel(); } public interface Speed { int value(); } Внутренний класс реализует некий публичный интерфейс.

47 Типичное использование внутреннего класса (cont.) public class DragonFlying { private class DFSpeed implements Speed { private int i = 11; public int value() { return i; } } protected class DFDestination implements Destination { private String label; private DFDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } Реализация остается закрытой.

48 Типичное использование внутреннего класса (cont.) public Destination dest(String s){ return new DFDestination(s); } public Speed speed() { return new DFSpeed(); } Наружу доступен только публично известный интерфейс.

49 Типичное использование внутреннего класса (cont.) class Test { public static void main(String[] args) { DragonFlying df = new DragonFlying(); Speed s = df.speed(); Destination d = df.dest("Tanzania"); // Незаконно - нельзя получить доступ к private классу: //! DragonFlying.DFSpeed dfs = df.new DFSpeed(); } Клиент может взаимодействовать только с публичным интерфейсом.

50 Внутренний класс в случайном контексте private void internalTracking(boolean b) { if(b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip("slip"); String s = ts.getSlip(); } // Нельзя его здесь использовать! Вне контекста: //! TrackingSlip ts = new TrackingSlip("x"); } Класс может быть определен даже в теле метода:

51 Внутренний класс в JDK Анонимный внутренний класс может быть определен в теле метода: private void doOnSeparateThread() { EventQueue.invokeLater(new Runnable(){ public void run(){ System.out.println(Executing on Event Dispatching Thread); } }); }

52 Константы class Dragon { final static int headCount = 1; } Dragon.headCount = 3;//ошибка – попытка присвоить значение константе. Дракон – не Змей Горыныч! class Gorinich { //MutableFloat – это класс-хранилище дробного числа и позволяющий изменять его final static MutableFloat headCount = new MutableFloat(1); } Gorinich.headVount.setValue(3);//ОК, т.к. значение указателя не меняется, меняется только содержимое Константа - это именованное значение, неизменяемое стандартными средствами языка Java.

53 Константы в статическом блоке class Dragon { //нет инициализации final static int headCount; static { //ОК – 1-я инициализация headCount = 1; //Ошибка – константа уже присвоена headCount = 3; } Инициализацию константы можно отложить, но только до времени выполнения статического блока класса. Допустимо произвести только одно присваивание константе.

54 Абстрактный класс abstract class FlyingThing { protected String name; abstract public void fly(); public String getName(){ return name; } //ошибка,абстрактный класс не может иметь реализаций FlyingThing aThing = new FlyingThing(); Класс является абстрактным, если имеет модификатор abstract. Класс должен быть помечен этим модификатором, если у него хоть один абстрактный метод (помечен словом abstract и не имеет реализации).

55 Наследование от абстрактного класса class Dragon extends FlyingSomething{ public fly(){ flySomewhere();//реализуем полет куда-нибудь } //ОК – создавать экземпляры можно Dragon d = new Dragon(); //ОК – создание ссылки на абстрактный класс и инициализация конкретным классом FlyingSomething fs = new Dragon(); Как правило, абстрактный класс служит для создания базы дерева наследования классов.

56 Реализацияинтерфейса public interface Flying{ // класс, реализующий данный интерфейс, // должен предоставить реализацию для // этого метода int speed(); } Интерфейс – это сущность, предназначенная для формирования структуры реализующего его класса или для наследования другим интерфейсом.

57 Реализация интерфейса (cont.) Класс может реализовывать множество интерфейсов. Реализующий класс должен реализовать все методы интерфейса. Интерфейсы могу наследоваться друг от друга. interface Flying long distance() long height() int speed() void fly() class Bird long distance() long height() int speed() void fly() class Dragon long distance() long height() int speed() void fly() class RedDragon long distance() int speed() void fly()

58 Реализация интерфейса (cont.) public class Dragon implements Flying { protected int speed; public int speed(){ return speed; } public class RedDragon extends Dragon{ public int speed(){ return 2*speed; } public long distance(){…} public long burn(Object obj){…} } Реализация позволяет снабдить класс дополнительными свойствами.

59 Правда ли что… Перед определением любого класса нужно указать пакет? Все методы в Java – виртуальные? Невозможно создать экземпляр абстрактного класса? Интерфейсы могут наследоваться друг от друга? Единственный способ создать объект – вызвать его конструктор?

60 Ссылки Java Language Specification: Рекомендации по оформлению программ: Учебник (раздел про внутренние классы): classes.html Качество кода:

Q&A

Андрей Дмитриев Sun Microsystems Октябрь 2009 Основы синтаксиса языка Java