92
Основные особенности языка Java - краткий обзор Ведущий семинара: Максим Лейкин, компания «МЕРА НН»

История создания и эволюция языка Java

  • Upload
    parley

  • View
    68

  • Download
    1

Embed Size (px)

DESCRIPTION

Основные особенности языка Java - краткий обзор Ведущий семинара: Максим Лейкин, компания «МЕРА НН». История создания и эволюция языка Java. Sun Microsystems ( www.sun.com ) – ныне часть компании Oracle ( www.oracle.com ). Patrick Naughton. James Gosling. Scott McNealy. - PowerPoint PPT Presentation

Citation preview

Page 1: История создания и эволюция языка  Java

Основные особенности языка Java - краткий обзор

Ведущий семинара: Максим Лейкин, компания «МЕРА НН»

Page 2: История создания и эволюция языка  Java

2

История создания и эволюция языка Java

James Gosling Scott McNealy Patrick Naughton

Sun Microsystems (www.sun.com) – ныне часть компании Oracle (www.oracle.com)

Январь, 1991 г. Начало разработки нового языка программирования.Главная причина недовольства С++:Необходимо перекомпилировать, а зачастую и переписывать код под каждую новую архитектуру микропроцеесора, операционную системуи т.п.

Page 3: История создания и эволюция языка  Java

3

История создания и эволюция языка Java

Сентябрь, 1992 г. Oak (дуб)

23 марта 1995 г. Официальное объявление языка Java

1999 г. - Java 2 SE – Java 2 Standard Edition

Page 4: История создания и эволюция языка  Java

4

Ключевые особенности языка Java

• архитектурная независимость и переносимость кода

• полная объектная ориентированность• устойчивость (надежность) кода • встроенный механизм поддержки

многопоточности• безопасность Java-программ • встроенная структура коллекций• удобство разработки GUI

Page 5: История создания и эволюция языка  Java

5

Архитектурная независимость и переносимость кода

C++

Java

"Write Once, Run Anywhere"

Page 6: История создания и эволюция языка  Java

6

Архитектурная независимость и переносимость кода

Java

Байт-код – архитектурно нейтральный,высокооптимизированный набор команд, предназначенных для выполнения специальнойисполняющей системой.

JVM (Java Virtual Machine, виртуальная Java-машина) –исполняющая система, интерпретирующая байт-код

Page 7: История создания и эволюция языка  Java

7

Архитектурная независимость и переносимость кода

Page 8: История создания и эволюция языка  Java

8

Полная объектная ориентированность

Основная структурная единица программы – класс, весь код Java-программы должен находиться внутриодного или нескольких классов.

Page 9: История создания и эволюция языка  Java

9

• отсутствие адресной арифметики • технология «сборки мусора» (garbage

collection)• строгая типизация• отсутствие множественного наследования

классов• запрет перегрузки операторов• встроенная обработка исключений

Устойчивость (надежность) кода

«Java is C++ without the Guns and Knives» (С) J.Gosling

Page 10: История создания и эволюция языка  Java

10

Многопоточность Java предоставляет средства создания приложений с множеством одновременно активных потоков. Для эффективной работы с потоками в Java реализован механизм семафоров и средств синхронизации потоков: библиотека языка предоставляет класс Thread, а система выполненияпредоставляет средства диспетчеризации и средства, реализующие семафоры.

Поддержка многопоточности

Page 11: История создания и эволюция языка  Java

11

Безопасность

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

Page 12: История создания и эволюция языка  Java

12

Встроенная структура коллекций

Структура коллекций

Интерфейсы Реализации Алгоритмы

Структура коллекций (collections framework) Java стандартизирует способ, с помощьюкоторого программы хранят и обрабатывают структуры данных.

Page 13: История создания и эволюция языка  Java

13

Встроенная структура коллекций

Преимущества использования структуры коллекций:1. Избавление от рутинных операций по

кодированию стандартных структур данных и алгоритмов

2. Высокая эффективность реализации3. Универсальность и простота изучения (различные типы коллекций работают похожим друг на друга образом и с высокой степенью способности к взаимодействию)4. Расширяемость 5. Параметризация

Page 14: История создания и эволюция языка  Java

14

Удобство разработки GUI

В состав Java входят 2 библиотеки, предназначенных для разработки GUI:

- AWT (Abstract Window Toolkit) – платформно-зависимая библиотека, вывод осуществляется через вызовы OS API

- Swing - платформно-незаивисимая библиотека, реализованная полностью на Java, через OS API выводится только окно, все остальное рисуется средствами Java

Page 15: История создания и эволюция языка  Java

15

Инструментальные средства

1. Java Software Development Kit - OracleТекущая версия Java(TM) SE Development Kit 7

http://www.oracle.com/technetwork/java/javase/downloads/index.html

2. RAD – средства разработки:– Eclipse Project (open source project) – NetBeans (open source project)– IntelliJ IDEA (JetBrains) – JCreator Pro (Xinox Software)– Symantec Cafe (Symantec)– Visual J++ (Microsoft)– Together (TogetherSoft Corporation)

Большая часть инструментария для разработки Java-программ распространяется бесплатно!

Page 16: История создания и эволюция языка  Java

16

Первая программа на Java

class FirstProg{public static void main(String args[ ])

{System.out.println (“Hello,

world”);}

}

1.

2.

-> FirstProg.class

Page 17: История создания и эволюция языка  Java

17

Литература и источники информации в сети Интернет

1. Ноутон П., Шилдт Г. Java 2 в подлиннике. – СПб, «BHV», 2001.2. Г.Шилдт. Полный справочник по Java. – М.: Вильямс, 2007. 3. Б. Эккель. Thinking in Java. – Спб.:Питер, 2009.4. Joshua Bloch. Effective Java: Second Edition. – Prentice Hall, 2008.5. М.Гранд. Шаблоны проектирования в JAVA. Каталог популярных шаблонов проектирования, проиллюстрированных при помощи UML. – М.: Новое знание, 2004. • http://docs.oracle.com/javase/tutorial/• http://www.intuit.ru/department/pl/javapl/

Page 18: История создания и эволюция языка  Java

18

Классы и методыОписание класса

<модификатор> class <ИмяКласса> {[модификатор] <тип> <переменная_экземпляра1>;

… [модификатор] <тип> <переменная_экземпляраN>; [модификатор] <тип> <метод_класса1>(<список форм. парам.)

{ // тело метода; } …

[модификатор] <тип> <метод_классаМ>(<список форм.парам.>){ // тело метода; }

}

Page 19: История создания и эволюция языка  Java

19

Классы и методыОписание класса

class Point{int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; } int getX() {return x;} int getY() {return y;}}

Экземплярные переменные (instance variables)

Методы класса (methods)

Конструкторы (перегруженные) Члены класса (class

members)

Page 20: История создания и эволюция языка  Java

20

Классы и методыСоздание ссылочных переменных и объектов класса

Point p1; создана ссылочная переменная

p1 = new Point(); создан объект

Point p3 = p1; создана ссылочная переменная указывающая на p1

Point p2 = new Point(); «короткая форма» создания объекта

p1

p3

объект

cсылка на p1

Page 21: История создания и эволюция языка  Java

21

Классы и методыСоздание ссылочных переменных и объектов класса

Point p1;{ p1 = new Point(5,10); p1 = null; }System.out.println(p1.x + "" + p1.y);

NullPointerException

{Point p1 = new Point(5,10);}System.out.println(p1.x + "" + p1.y);Cannot find variable p1

Point p2;{Point p1 = new Point(5,10); p2 = p1; p1 = null; } System.out.println(p2.x + “, “ + p2.y);5, 10

Page 22: История создания и эволюция языка  Java

22

Классы и методыПерегрузка (overloading) методов

[модификатор] <тип> <имя_метода> (<список форм. парам.)

сигнатура метода

Перегрузка – создание 2 и более методов с одинаковымиименами но разными сигнатурами

Page 23: История создания и эволюция языка  Java

23

Классы и методы

class OverloadDemo{void test()

{System.out.println(“Параметры отсутствуют”);}

void test(int a, int b){System.out.println(“a и b:” + a + ” “ + b);}

void test(double a){System.out.println(“Вещественное a:” + a);}

}

Перегрузка (overloading) методов

Page 24: История создания и эволюция языка  Java

24

Классы и методыМодификатор static

Статические переменные

Объявление: static <type> <name>

Статические переменные:• создаются в единственном экземпляре• существуют вне зависимости от объектов класса• создаются JVM в момент первого обращения к

классу• допускают обращение до создания объектов

класса

Обращение: <classname>.<varname>

Page 25: История создания и эволюция языка  Java

25

Классы и методыМодификатор static

Статические методы

Обращение: <classname>.<metodname>()

Статические методы:• могут вызывать только другие статические

методы данного класса• должны обращаться только к статическим

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

использовать ссылки this и super

Объявление: static <type> <name> (<parameters>)

Page 26: История создания и эволюция языка  Java

26

Классы и методыМодификатор static

Статические блоки кода

Объявление: static {

…}

Статический блок кода выполняется один раз при первоначальной загрузке класса

Page 27: История создания и эволюция языка  Java

27

Классы и методыИспользование ключевого слова this

1. Чтобы обойти скрытие переменной экземпляра формальными параметрами

Class Point{ int x, y;

Point (int x, int y){this.x=x; this.y=y; }

}

Page 28: История создания и эволюция языка  Java

28

Классы и методыИспользование ключевого слова this

2. Чтобы вызвать один конструктор из другого конструктора (explicit constructor invocation)

public class Rectangle {private int x, y, w, h; public Rectangle()

{this.x = 0; this.y = 0; this.w = 0; this.h = 0;} public Rectangle(int w, int h)

{this.x = 0; this.y = 0; this.w = w; this.h = h;} public Rectangle(int x, int y, int w, int h)

{this.x = x; this.y = y; this.w = w; this.h = h; }}

Page 29: История создания и эволюция языка  Java

29

Классы и методыИспользование ключевого слова this

2. Чтобы вызвать один конструктор из другого конструктора (explicit constructor invocation)

public class Rectangle {private int x, y, w, h; public Rectangle()

{this(0, 0, 0, 0);} public Rectangle(int w, int h)

{this(0, 0, w, h);} public Rectangle(int x, int y, int w, int h)

{this.x = x; this.y = y; this.w = w; this.h = h; }}

Page 30: История создания и эволюция языка  Java

30

Классы и методыВложенные классы

Вложенные классы

Статические вложенные классы (static nested classes)

Нестатические вложенные классы (inner classes - внутренние классы)

Причины создания вложенных классов:1.Логическая группировка классов2.Расширяет возможности инкапсуляции3.В некоторых случаях повышает читабельность кода

Page 31: История создания и эволюция языка  Java

31

Классы и методыСтатические вложенные классы

Статический вложенный класс является статическим членом класса, в который он вложен. Т.е. он не может напрямую работать с нестатическими переменными и методами внешнего класса.

Page 32: История создания и эволюция языка  Java

32

Классы и методыСтатические вложенные классы

class A { static int x; int y; A() { System.out.println("constructor A"); } static class B {B() { System.out.println("constrcutor B"); x = 5; A a = new A(); a.y = 15; } }}

public class Test { public static void main(String[ ] args) { A.B b = new A.B(); }}

Page 33: История создания и эволюция языка  Java

33

Классы и методыНестатические вложенные классы

Нестатический вложенный класс является обычным членом внешнего класса, т.е. существует только в составе объекта внешнего класса и имеет прямой доступ к переменным и методам внешнего класса.

Объект вложенного класса может существовать только внутри объекта внешнего класса

Существуют (и довольно часто используются) также анонимные внутренние классы (рассмотрим в обработке событий)

Page 34: История создания и эволюция языка  Java

34

Классы и методыНестатические вложенные классы

class A { static int x; int y; A() { System.out.println("constructor A"); } class B { B() { System.out.println("constrcutor B"); x = 5; y = 15; } }}

public class Test { public static void main(String[ ] args) { A a = new A(); A.B b = a.new B(); }}

Page 35: История создания и эволюция языка  Java

35

Классы и методыНаследование

Общая форма объявления класса, наследующегосуперкласс:

class <subclass_name> extends <superclass_name> {

//тело класса}

Язык Java не поддерживает множественного наследования классов!!!

Page 36: История создания и эволюция языка  Java

36

Классы и методыНаследование

class Point3D extends Point{int z; Point3D () { z=0; } Point3D (int x1, int y1, int z1) { z=z1; }}

Page 37: История создания и эволюция языка  Java

37

Классы и методыПорядок вызова конструкторов при

наследовании

При создании объекта подкласса всегда вызывается конструктор его базового класса, у того конструктор его базового класса и т.д. вплоть до корня иерархии (класса Object). Причем если не указано явно (с помощью super) вызывается конструктор без параметров (созданный явно или по умолчанию).

Если подходящего конструктора нет – выдается ошибка компиляции.

Page 38: История создания и эволюция языка  Java

38

Классы и методыКлючевое слово super

super (parameters) – вызов должен быть первым в конструкторе подкласса

Внимание! Это применяется только если надо вызвать конструктор суперкласса с параметрами!

1. Вызов конструктора непосредственного суперкласса

super.var_name или super.metod_name()(super не влияет на тип доступа)

2. Доступ к элементу суперкласса, скрытому элементом подкласса

Page 39: История создания и эволюция языка  Java

39

Классы и методыПорядок вызова конструкторов при

наследовании без использования super

class Point3D extends Point{int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { z=z1; }}

Point3D p3d = new Point3D();

Point() -> Point3D()

Point3D p3d = new Point3D(10, 20, 30);

Point() -> Point3D(10,20,30)

Page 40: История создания и эволюция языка  Java

40

Классы и методыПорядок вызова конструкторов при

наследовании с использованием super

class Point3D extends Point{int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { super (x1, y1); z=z1; }}

Point3D p3d = new Point3D();

Point() -> Point3D()

Point3D p3d = new Point3D(10, 20, 30);

Point(10, 20) -> Point3D(10,20,30)

Page 41: История создания и эволюция языка  Java

41

Классы и методыМодификаторы доступа

class Parent{public int v1; private int v2; protected int v3; int v4; }

class Child extends Parent{ // доступны v1, v3, v4 // недоступна v2}

class Other{ // доступны v1, v3, v4 // недоступна v2}

Page 42: История создания и эволюция языка  Java

42

Классы и методыМодификаторы доступа

В правильно спроектированном Java-классе, все экземплярные переменные класса должны иметь модификатор private, доступ должен осуществляться через set/get методы («сеттеры/геттеры»)В Eclipse: Source -> generate Getters and Setters

Page 43: История создания и эволюция языка  Java

43

Классы и методыМодификаторы доступа

class Point{int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; }}

class Point{private int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; } public int getX() {return x;} public int getY() {return y;} public int setX(int x) { this.x = x;} public int setY(int y) { this.y = y;}}

Page 44: История создания и эволюция языка  Java

44

Классы и методыДинамическая

диспетчеризация ссылок

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

Page 45: История создания и эволюция языка  Java

45

Классы и методыДинамическая

диспетчеризация ссылок

class Point{

int x, int y;}class Point3D extends Point{

int z;}

…Point Pobj = new Point();Point3D Cobj = new Point3D();Pobj = Cobj;Pobj.x = 1; //верно! x определена в

PointPobj.z = 10; //ошибка! z не

определена в Point…

Page 46: История создания и эволюция языка  Java

46

Классы и методыДинамическая

диспетчеризация методов

Переопределение метода (overriding) – создание в подклассе метода, совпадающего по сигнатуре с методом суперкласса.

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

Page 47: История создания и эволюция языка  Java

47

Классы и методыДинамическая

диспетчеризация методов

class Figure{double dim1, dim2; Figure(double a, double b) {dim1 = a; dim2 = b; } void square()

{System.out.println (“Square is not defined”); }

}

class Rectangle extends Figure{Rectangle(double a, double b)

{super(a,b); } void square()

{System.out.println(“Rectangle square = ” + (dim1*dim2)); }

}

Page 48: История создания и эволюция языка  Java

48

Классы и методыДинамическая

диспетчеризация методов

class Triangle extends Figure{Triangle(double a, double b)

{super(a,b); } void square()

{System.out.println(“Triangle square= ” + (dim1*dim2/2)); }

}

class FindSquare{public static void main(String args[ ])

{Figure f; Random r = new Random(); for (int k=0; k<10; k++) { int i = r.nextInt(100); if (i<50)

{ f = new Rectangle(9,5); } else { f = new Triangle(10,8); } f.square(); } } }

Page 49: История создания и эволюция языка  Java

49

Классы и методыДинамическая

диспетчеризация методов

Вывод этой программы: Rectangle square = 45.0Triangle square= 40.0Rectangle square = 45.0Rectangle square = 45.0Triangle square= 40.0Triangle square= 40.0Rectangle square = 45.0Rectangle square = 45.0Triangle square= 40.0Rectangle square = 45.0

Page 50: История создания и эволюция языка  Java

50

Классы и методыАбстрактные методы и классы

Объявление абстрактного метода:abstract <type> <method_name> (<parameters>);

Если в классе есть хотя бы один абстрактный метод -> класс должен быть объявлен абстрактным.

abstract class <class_name> { …}

Любой подкласс абстрактного класса должен или реализовать все его абстрактные методы или сам должен быть объявлен абстрактным !

Page 51: История создания и эволюция языка  Java

51

Классы и методыАбстрактные методы и классы

abstract class Figure{double dim1, dim2; Figure(double a, double b) {dim1 = a;

dim2 = b; }

abstract void square();}

Page 52: История создания и эволюция языка  Java

52

Интерфейсы[<модификатор>] interface <имя> [extends

<список интерфейсов>]{ <тип> <имя_метода>(<список

параметров>); ... <тип> <имя_константы> = <значение>; }

1. Интерфейсы допускают множественное наследование2. Все методы – абстрактные (без модификатора abstract)3. Все переменные – static и final (без соотв.

модификаторов), необходима инициализация4. Все переменные и методы – public (без модификатора)

Page 53: История создания и эволюция языка  Java

53

ИнтерфейсыРеализация интерфейсов

class <имя_класса> [extends <имя_суперкласса>] [implements <список интерфейсов>] { …}

interface Callback {void callback(int param);}class Client implements Callback {public void callback(int p)

{System.out.println("callback called with " + p); } }

Page 54: История создания и эволюция языка  Java

54

ИнтерфейсыРеализация интерфейсов

Особенности реализации интерфейсов:1. Методы, которые реализуют интерфейс, должны быть

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

2. Если класс включает интерфейс, но реализует не все его методы, то такой класс должен быть объявлен как абстрактный.

3. Если класс реализует интерфейс, унаследованный от другого интерфейса, класс должен реализовать все методы, определенные в цепочке наследования интерфейсов.

Page 55: История создания и эволюция языка  Java

55

ИнтерфейсыСсылочные переменные

интерфейсного типаinterface Callback {void callback(int param);}class Client implements Callback { public void callback(int p) //реализация метода

интерфейса{System.out.println("callback called with " + p);}

int getSquare(int p) //собственный метод класса{System.out.println("square = " + (p*p));}

}

Page 56: История создания и эволюция языка  Java

56

Интерфейсы

class TestIface {public static void main(String args[ ])

{Callback с = new Client(); c.callback(42); //верно! c.getSquare(42); //ошибка! ссылочная переменная интерфейсного типа не может обращаться к собственным методам классов}

}

Ссылочные переменные интерфейсного типа

Page 57: История создания и эволюция языка  Java

57

ИнтерфейсыВзаимоотношения классов и

интерфейсов

C2

C1

C3

C5C4 C7C6

I2

I1

I3

I5I4 I7I6

I8

Классы Интерфейсы

extends

extends

extends

extends

extends

implements

implements

Page 58: История создания и эволюция языка  Java

58

Классы и методыМодификатор final

1. final double pi = 3.14; //неизменяемая локальная переменная

2. final int getX(){…}

//метод, для которого запрещено переопределение (overriding)

3. final class A{…}

//класс, для которого запрещено наследование

Page 59: История создания и эволюция языка  Java

59

Классы и методыfinal-члены классов,

неизменяемые объектыclass A { final String mName; public A(String name) { mName = name; } public getName() { return mName; } public setK(String name) { mName = name; } }

Преимущества неизменяемых объектов:1) Потокобезопасность !2) Производительность !

Page 60: История создания и эволюция языка  Java

60

Перечисления в Java: enum

enum Season { WINTER, SPRING, SUMMER, AUTUMN }

Season season = Season.SPRING; if (season == Season.SPRING) { season = Season.SUMMER; }System.out.println(season);

Классы и методы

Page 61: История создания и эволюция языка  Java

61

Перечисление – это класс

Объявляя enum мы неявно создаем класс производный от java.lang.Enum. Конструкция enum Season { ... } эквивалентна class Season extends java.lang.Enum { ... }. Явным образом наследоваться от java.lang.Enum не позволяет компилятор, но: System.out.println(Season.class.getSuperclass());дает вывод:class java.lang.Enum

Классы и методы

Page 62: История создания и эволюция языка  Java

62

Перечисление – это класс

Собственно наследование за нас автоматически выполняет компилятор Java. Условимся называть класс, созданный компилятором для реализации перечисления – enum-классом, а возможные значения перечисляемого типа – элементами enum-a. Элементы перечисления - экземпляры enum-класса, доступные статически.

Классы и методы

Page 63: История создания и эволюция языка  Java

63

Название и порядковый номер элемента enum

Любой enum-класс наследует java.lang.Enum, который содержит ряд методов полезных для всех перечислений. Пример: Season season = Season.WINTER; System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal()); Вывод:season.name()=WINTER season.toString()=WINTER season.ordinal()=0

Классы и методы

Page 64: История создания и эволюция языка  Java

64

Получение элемента по строковому имени

Задача: получить элемент enum по его строковому представлению. Решение: В каждом enum-классе компилятор автоматически создает специальный статический метод: public static EnumClass valueOf(String name), который возвращает элемент перечисления EnumClass с названием, равным name. Пример использования: String name = "WINTER"; Season season = Season.valueOf(name);Результат: переменная season будет равна Season.WINTER. Если элемент не будет найден, то будет выброшен IllegalArgumentException, а если name равен null - NullPointerException.

Классы и методы

Page 65: История создания и эволюция языка  Java

65

Получение всех элементов перечисления

Иногда необходимо получить список всех элементов enum-класса во время выполнения. Для этих целей в каждом enum-классе компилятор создает метод: public static EnumClass[ ] values() Пример использования: System.out.println(Arrays.toString(Season.values()));Вывод:[WINTER, SPRING, SUMMER, AUTUMN]Обратите внимание, что ни метод valueOf(), ни метод values() не определен в классе java.lang.Enum. Вместо этого они автоматически добавляются компилятором на этапе компиляции enum-класса.

Классы и методы

Page 66: История создания и эволюция языка  Java

66

Методы с переменным числом аргументов в Java

Возможность была добавлена в JDK 1.5.Для указания аргумента переменной длины используют три точки (...). Например: static void vaTest(int ... v) { … }Эта синтаксическая конструкция указывает компилятору, что метод vaTest () может вызываться с нулем или более аргументов. В результате v неявно объявляется как массив типа int [ ]. Таким образом, внутри метода vaTest () доступ к v осуществляется с использованием синтаксиса обычного массива.

Классы и методы

Page 67: История создания и эволюция языка  Java

67

Методы с переменным числом аргументов в Java

class VarArgs {static void vaTest(int ... v) { System.out.println("Кол-во аргументов: " + v.length); for (int i=0;i<v.length;i++) { System.out.print (v[i] + " "); } public static void main(String args[]) { vaTest (10); //1 аргумент vaTest (1, 2, 3); //3 аргумента vaTest (); // без аргументов }}

Классы и методы

Page 68: История создания и эволюция языка  Java

68

Методы с переменным числом аргументов в Java

Вывод:Количество аргументов: 110Количество аргументов: 31 2 3Количество аргументов: 0

Классы и методы

Page 69: История создания и эволюция языка  Java

69

Методы с переменным числом аргументов в Java

Вместе с параметром переменной длины массив может содержать обычные параметры. Однако параметр переменной длины должен быть последним параметром, объявленным методом. Например:int dolt(int a, int b, double с, int ... vals) //верно!int dolt (int a, int b, double с, int ... vals, boolean stopFlag) // ошибка!Метод должен содержать только одни параметр типа varargs. int dolt (int a, int b, double с, int ... vals, double ... morevals) // ошибка!

Классы и методы

Page 70: История создания и эволюция языка  Java

70

Пакеты

Java обеспечивает специальный механизм дляразделения пространства имен классов наименованные области. Этот механизмназывается «пакеты» (packages). Пакет – это контейнер для классов, в пределах которогодолжна сохраняться уникальность именклассов.Общая форма определения пакета: package <pkg_name>;

Понятие пакета

Page 71: История создания и эволюция языка  Java

71

Пакеты

Чтобы хранить пакеты, Java используеткаталоги файловой системы. Class-файлы для всех классов, принадлежащих к одному пакету, должны быть сохранены в каталоге, название которогосовпадает с именем пакета (регистр важен).

package pkg1[.pkg2[.pkg3]];Иерархия пакетов:

package java.awt.image; java\awt\image

Размещением корня любой иерархии пакетов в файловойсистеме управляет специальная переменная окруженияCLASSPATH.

Иерархия пакетов

Page 72: История создания и эволюция языка  Java

72

ПакетыИмпорт пакетов

Импорт класса или пакета:

import pkg1[.pkg2].(classname|*);

Полное имя класса включает всю иерархию пакетов.

1. Импортирование класса никак не влияет науровень доступа к его элементам !!!

2. В любую Java-программу автоматически импортируется пакет java.lang.* !!!

Page 73: История создания и эволюция языка  Java

73

ПакетыУровни доступа с учетом пакетов

package p1; package p2;public class A { public class D extends A { public int pub; } protected prot; public class E { int def; } private int priv;}public class B extends A { }public class C { }

Page 74: История создания и эволюция языка  Java

74

ПакетыУровни доступа с учетом пакетов

A B C D E

public + + + + +protected + + + + -

<default> + + + - -private + - - - -

Page 75: История создания и эволюция языка  Java

75

ПакетыУровни доступа с учетом пакетов1. Доступ на уровне класса:

- public - класс виден везде- <default> - класс виден в пределах

своего пакета2. Доступ на уровне членов класса:

Модифи-катор

Внутри класса

В том же пакете

Подкласс в другом пакете

Произвольный класс в другом

пакетеpublic + + + +protected + + + -<default> + + - -private + - - -

Page 76: История создания и эволюция языка  Java

76

Структура Java-программы

- В первой строке файла может быть 1 необязательный оператор package

- В следующих строках может быть 1 или несколько необязательных операторов import

- Далее идут описания классов и интерфейсов

Среди классов, описанных в одномфайле, только один может бытьобъявлен с модификаторомpublic.

Page 77: История создания и эволюция языка  Java

77

Обработка исключений

Типы ошибок

Ошибки компиляции Времени выполнения (run-time errors, exceptions, исключения)

if (flag == 1) n=0;else n=1;val=1/n;

Логические ошибки

Page 78: История создания и эволюция языка  Java

78

Обработка исключений

Исключение в Java — это объектнекоторого класса, который описывает исключительное состояние, возникшее в каком-либо участке программного кода. При возникновении исключенияисполняющая система Java создаетобъект класса, связанного с данным исключением. Этот объект хранит информацию о возникшейисключительной ситуации (точкавозникновения, описание и т.п.) Возможна как автоматическая так и программная генерация исключений.

Page 79: История создания и эволюция языка  Java

79

Обработка исключений

try { // блок кода } catch (ExceptionType1 еxOb1) { // обработчик исключений типа

ExceptionType1 } [catch (ExceptionType2 еxOb2) { // обработчик исключений типа

ExceptionType2 }] [finally { //код, который выполняется перед

выходом из блока try }]

Формат try-catch блока

Page 80: История создания и эволюция языка  Java

80

Обработка исключенийФормат try-catch блока

try { read_from_file ("data.txt"); calculate();} catch ( FileNotFoundException fe ) { System.out.println("Файл data.txt не найден");} catch ( ArithmeticException aex ) { System.out.println("Деление на ноль");}

Page 81: История создания и эволюция языка  Java

81

Обработка исключенийФормат try-catch блока

• управление никогда не возвращается из блока catch обратно в блок try, после выполнения catch-блока управление передается строке, следующей сразу после try-catch-блока;

• область видимости catch-блока ограничена ближайшим предшествующим утверждением try, т.е. catch-блок не может захватывать исключение, выброшенное «не своим» try-блоком;

• операторы, контролируемые утверждением try, должны быть окружены фигурными скобками даже если это одиночная инструкция.

• блоки try могут быть вложенными

Page 82: История создания и эволюция языка  Java

82

Обработка исключенийСтек вызовов

Если обработчик не найден исключение передается JVM.

Page 83: История создания и эволюция языка  Java

83

Обработка исключенийДефолтный обработчик исключений

Page 84: История создания и эволюция языка  Java

84

Обработка исключенийКлассы исключений

никогда не обрабатываются, т.к. не имеет смысла

обязательно обрабатывать, иначе код не скомпилируется

надо обрабатывать, но компилятор это не проверяет

Page 85: История создания и эволюция языка  Java

85

Обработка исключенийКлассы исключений

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

Page 86: История создания и эволюция языка  Java

86

Обработка исключенийКлассы исключений

try {inputFile("data.txt"); calculate(); }

catch ( IOException ExObj2) {System.out.println("Ошибка ввода-вывода"); }

catch ( FileNotFoundException ExObj1) {System.out.println("Файл data.txt не найден"); }

Error: unreachable code!т.к. FileNotFoundException – подкласс IOException

catch ( FileNotFoundException ExObj1) {System.out.println("Файл data.txt не найден"); }

catch ( IOException ExObj2) {System.out.println("Ошибка ввода-вывода"); }

Page 87: История создания и эволюция языка  Java

87

Обработка исключенийОператор throw

Программная генерация исключения:throw new <ExceptionClassName>();throw new <ExceptionClassName>(“…”);

Page 88: История создания и эволюция языка  Java

88

Обработка исключенийОператор throw

public void demoproc (){try {throw new NullPointerException("demo"); } catch (NullPointerException e) {System.out.println("caught inside demoproc"); throw e; } } public static void main(String args[]) {try {demoproc(); } catch(NullPointerException e) {System.out.println("recaught: " + e); } }

Page 89: История создания и эволюция языка  Java

89

Обработка исключенийОператор throw

Вывод программы:

Page 90: История создания и эволюция языка  Java

90

Обработка исключенийОператор throws

Исключения, которые порождены от Exception, но не от RuntimeException, могут быть сгенерированытолько явно операцией throw. При этом если методможет выбрасывать одно из таких исключений, то должно выполняться одно из двух условий: либо для такого исключения должен быть catch-обработчик, либо в заголовке такого метода должна стоять конструкция:

throws <ExceptionClassName>

(т.н. Catch or Specify Requirement)

public String readLine() throws IOException

Page 91: История создания и эволюция языка  Java

91

Обработка исключенийОператор throws

Вызов метода, в описании которого стоит " throws ... ", тоже должен находиться либо внутри try-catch-блока, либо внутри метода с конструкцией " throws ... " в его заголовке и т.д. вплоть до метода main(). Таким образом, где-то в программе любое возможное исключение, попадающее в категорию Catch or Specify Requirement обязано быть перехвачено и обработано.

Page 92: История создания и эволюция языка  Java

92

Обработка исключенийПодклассы Exception

class MyException extends Exception {private int detail; MyException(int a)

{detail = a; } public String toString()

{return "MyException[" + detail + "]"; } }

Если надо создать исключение необязательное к перехвату – его надо унаследовать от RuntimeException.