960 likes | 1.33k Views
Основные особенности языка Java - краткий обзор Ведущий семинара: Максим Лейкин, компания «МЕРА НН». История создания и эволюция языка Java. Sun Microsystems ( www.sun.com ) – ныне часть компании Oracle ( www.oracle.com ). Patrick Naughton. James Gosling. Scott McNealy.
E N D
Основные особенности языка Java - краткий обзорВедущий семинара: Максим Лейкин, компания «МЕРА НН»
История создания и эволюция языка Java Sun Microsystems (www.sun.com) – ныне часть компании Oracle (www.oracle.com) Patrick Naughton James Gosling Scott McNealy Январь, 1991г. Начало разработки нового языка программирования. Главная причина недовольства С++: Необходимо перекомпилировать, а зачастую и переписывать код под каждую новую архитектуру микропроцеесора, операционную систему и т.п.
История создания и эволюция языка Java Сентябрь, 1992 г. Oak (дуб) 23 марта 1995 г. Официальное объявление языка Java 1999 г. - Java 2 SE – Java 2 Standard Edition
Ключевые особенности языка Java • архитектурная независимость и переносимость кода • полная объектная ориентированность • устойчивость (надежность) кода • встроенный механизм поддержки многопоточности • безопасность Java-программ • встроенная структура коллекций • удобство разработки GUI
Архитектурная независимость и переносимость кода C++ "Write Once, Run Anywhere" Java
Архитектурная независимость и переносимость кода Байт-код – архитектурно нейтральный, высокооптимизированный набор команд, предназначенных для выполнения специальной исполняющей системой. Java JVM (Java Virtual Machine, виртуальная Java-машина) – исполняющая система, интерпретирующая байт-код
Архитектурная независимость и переносимость кода
Полная объектная ориентированность • Основная структурная единица программы – класс, • весь код Java-программы должен находиться внутри • одного или нескольких классов.
Устойчивость (надежность) кода • отсутствие адресной арифметики • технология «сборки мусора» (garbage collection) • строгая типизация • отсутствие множественного наследованияклассов • запрет перегрузки операторов • встроенная обработка исключений «Java is C++ without the Guns and Knives» (С) J.Gosling
Поддержка многопоточности Многопоточность Java предоставляет средства создания приложений с множеством одновременно активных потоков. Для эффективной работыс потоками в Java реализован механизм семафоров и средствсинхронизации потоков: библиотека языка предоставляет класс Thread, а система выполнения предоставляет средства диспетчеризации и средства, реализующие семафоры.
Безопасность JVM - аналог виртуального компьютера, расположенного в оперативной памяти и интерпретирующего байт- код. Все действия Java- программы замкнуты внутри этого виртуального компьютера. JVM может не допускать деструктивных действий Java-программ.
Встроенная структура коллекций Структура коллекций (collectionsframework) Java стандартизирует способ, с помощью которого программы хранят и обрабатывают структуры данных. Структура коллекций Интерфейсы Реализации Алгоритмы
Встроенная структура коллекций • Преимущества использования структуры коллекций: • Избавление от рутинных операций по • кодированию стандартных структур данных и алгоритмов • 2. Высокая эффективность реализации • 3. Универсальность и простота изучения • (различные типы коллекций работают • похожим друг на друга образом и с высокой • степенью способности к взаимодействию) • 4. Расширяемость • 5. Параметризация
Удобство разработки GUI В состав Java входят 2 библиотеки, предназначенных для разработки GUI: - AWT (Abstract Window Toolkit) – платформно-зависимая библиотека, вывод осуществляется через вызовы OS API - Swing - платформно-незаивисимая библиотека, реализованная полностью на Java, через OS API выводится только окно, все остальное рисуется средствами Java
Инструментальные средства Большая часть инструментария для разработки Java-программраспространяется бесплатно! • 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 class FirstProg {public static void main(String args[ ]) { System.out.println (“Hello, world”); } } 1. -> FirstProg.class 2.
Литература и источники информации в сети Интернет 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/
Классы и методы Описание класса <модификатор> class <ИмяКласса> {[модификатор] <тип> <переменная_экземпляра1>; … [модификатор] <тип> <переменная_экземпляраN>; [модификатор] <тип> <метод_класса1>(<список форм. парам.) { // тело метода; } … [модификатор] <тип> <метод_классаМ>(<список форм.парам.>) { // тело метода; } }
Классы и методы Описание класса 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) Конструкторы (перегруженные) Члены класса (class members) Методы класса (methods)
Классы и методы Создание ссылочных переменных и объектов класса создана ссылочная переменная Point p1; p1 = new Point(); созданобъект «короткая форма» создания объекта Point p2 = new Point(); создана ссылочная переменная указывающая на p1 Point p3 = p1; p1 объект p3 cсылка на p1
Классы и методы Создание ссылочных переменных и объектов класса {Point p1 = new Point(5,10); } System.out.println(p1.x + "" + p1.y); Cannot find variable p1 Point p1; { p1 = new Point(5,10); p1 = null; } System.out.println(p1.x + "" + p1.y); NullPointerException Point p2; {Point p1 = new Point(5,10); p2 = p1; p1 = null; } System.out.println(p2.x + “, “ + p2.y); 5, 10
Классы и методы Перегрузка (overloading)методов [модификатор] <тип> <имя_метода> (<список форм. парам.) сигнатура метода Перегрузка – создание 2 и более методов с одинаковыми именами но разными сигнатурами
Классы и методы Перегрузка (overloading)методов 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); } }
Классы и методы Модификатор static Статические переменные Объявление: static <type> <name> Обращение: <classname>.<varname> • Статические переменные: • создаются в единственном экземпляре • существуют вне зависимости от объектов класса • создаются JVM в момент первого обращения к классу • допускают обращение до создания объектов класса
Классы и методы Модификатор static Статические методы Объявление: static <type> <name> (<parameters>) Обращение: <classname>.<metodname>() • Статические методы: • могут вызывать только другие статические методыданного класса • должны обращаться только к статическим переменным • внутри статических методов нельзя использовать ссылки this и super
Классы и методы Модификатор static Статические блоки кода Объявление: static { … } Статический блок кода выполняется один раз при первоначальной загрузке класса
Классы и методы Использование ключевого слова this 1. Чтобы обойти скрытие переменной экземпляра формальными параметрами Class Point { int x, y; Point (int x, int y) {this.x=x; this.y=y; } }
Классы и методы Использование ключевого слова 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; } }
Классы и методы Использование ключевого слова 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; } }
Классы и методы Вложенные классы Вложенные классы Статические вложенные классы (static nested classes) Нестатические вложенные классы (inner classes - внутренние классы) • Причины создания вложенных классов: • Логическая группировка классов • Расширяет возможности инкапсуляции • В некоторых случаях повышает читабельность кода
Классы и методы Статические вложенные классы Статический вложенный класс является статическим членом класса, в который он вложен. Т.е. он не может напрямую работать с нестатическими переменными и методами внешнего класса.
Классы и методы Статические вложенные классы 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(); } }
Классы и методы Нестатические вложенные классы Нестатический вложенный класс является обычным членом внешнего класса, т.е. существует только в составе объекта внешнего класса и имеет прямой доступ к переменным и методам внешнего класса. Объект вложенного класса может существовать только внутри объекта внешнего класса Существуют (и довольно часто используются) также анонимные внутренние классы (рассмотрим в обработке событий)
Классы и методы Нестатические вложенные классы 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(); } }
Классы и методы Наследование Общая форма объявления класса, наследующего суперкласс: class <subclass_name> extends <superclass_name> { //тело класса } Язык Java не поддерживает множественного наследования классов!!!
Классы и методы Наследование class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { z=z1; } }
Классы и методы Порядок вызова конструкторов при наследовании При создании объекта подкласса всегда вызывается конструктор его базового класса, у того конструктор его базового класса и т.д. вплоть до корня иерархии (класса Object). Причемесли не указано явно (с помощью super) вызывается конструктор без параметров (созданный явно или по умолчанию). Если подходящего конструктора нет – выдается ошибка компиляции.
Классы и методы Ключевое слово super • Вызов конструктора непосредственного суперкласса super (parameters) – вызов должен быть первым в конструкторе подкласса Внимание! Это применяется только если надо вызвать конструктор суперкласса с параметрами! 2. Доступ к элементу суперкласса, скрытому элементом подкласса super.var_name или super.metod_name() (super не влияет на тип доступа)
Классы и методы Порядок вызова конструкторов при наследованиибез использования 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)
Классы и методы Порядок вызова конструкторов при наследованиис использованием 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)
Классы и методы Модификаторы доступа class Parent {public int v1; private int v2; protected int v3; int v4; } class Other { // доступны v1, v3, v4 // недоступна v2 } class Child extends Parent { // доступны v1, v3, v4 // недоступна v2 }
Классы и методы Модификаторы доступа В правильно спроектированном Java- классе, все экземплярные переменные класса должны иметь модификатор private, доступ должен осуществляться через set/get методы («сеттеры/геттеры») В Eclipse: Source -> generate Getters and Setters
Классы и методы Модификаторы доступа 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;} } class Point {int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; } }
Классы и методы Динамическая диспетчеризация ссылок Ссылочной переменной суперкласса может быть назначена ссылка на любой подкласс, производный от этого суперкласса. Если ссылочная переменная суперкласса указывает на объект подкласса, через эту переменную можно получить доступ только к тем членам подкласса, которые определяются в суперклассе.
Классы и методы Динамическая диспетчеризация ссылок … Point Pobj = new Point(); Point3D Cobj = new Point3D(); Pobj = Cobj; Pobj.x = 1; //верно! x определена в Point Pobj.z = 10; //ошибка! z не определена в Point … class Point { int x, int y; } class Point3D extends Point { int z; }
Классы и методы Динамическая диспетчеризация методов Переопределение метода (overriding) – создание в подклассе метода, совпадающего по сигнатуре с методом суперкласса. Динамическая диспетчеризация методов – это механизм, позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции.
Классы и методы Динамическая диспетчеризация методов 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));} }
Классы и методы Динамическая диспетчеризация методов 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();} }} class Triangle extends Figure {Triangle(double a, double b) {super(a,b); } void square() {System.out.println(“Triangle square= ” + (dim1*dim2/2));} }
Классы и методы Динамическая диспетчеризация методов Вывод этой программы: Rectangle square = 45.0 Triangle square= 40.0 Rectangle square = 45.0 Rectangle square = 45.0 Triangle square= 40.0 Triangle square= 40.0 Rectangle square = 45.0 Rectangle square = 45.0 Triangle square= 40.0 Rectangle square = 45.0
Классы и методы Абстрактные методы и классы Объявление абстрактного метода: abstract <type> <method_name> (<parameters>); Если в классе есть хотя бы один абстрактный метод -> класс должен быть объявлен абстрактным. abstract class <class_name> { … } Любой подкласс абстрактного класса долженили реализовать все его абстрактные методы или сам должен быть объявлен абстрактным !