170.06K
Категория: ПрограммированиеПрограммирование

Язык программирования Java

1.

ЛЕКЦИЯ №1. Введение в Java
1.1. Базовые сведения о Java
Java - кроссплатформенный, объектно-ориентированный,
бесплатный язык программирования, разработанный компанией Sun
Microsystems (в последующем приобретённой компанией Oracle).
Программы на Java транслируются в байт-код, выполняемый
виртуальной машиной Java (Java VM, JVM) - программой,
обрабатывающей байт-код и передающей инструкции оборудованию как
интерпретатор.
Основное достоинство языка Java - именно в его кроссплатформенности. Байт-код не зависит от оборудования и легко
переносим.
Главным недостатком Java является то, что, в отличие от C++ или
Delphi, это все же не компилятор, а интерпретатор. Программа на Java
работает в среднем в 2-5 раз медленнее, чем программа на C++ и
потребляет в среднем в 10 раз больше памяти.
Java
является
базовым
языком
программирования
для
операционной системы Android. Однако, прежде, чем приступить к
изучению программирования на Java для Android, несколько лекций мы
посвятим изучению основ Java без привязки к какой-либо операционной
системе.
На рис. 1.1 приведена структурная схема жизненного цикла
разработки и запуска программы на языке Java.
MyProg.java
Компилятор
javac
MyProg.class
(байт-код)
Java VM
Запуск
программы
Рис. 1.1. Жизненный цикл разработки и запуска программы на языке Java
Исходный текст Java-программы должен быть файлом с
расширением .java. Для компиляции программы в байт-код используется
программа javac из JDK6, который мы научились устанавливать на
компьютер в ходе лабораторной работы №1. Чтобы откомпилировать
программу MyProg.java нужно в командной строке набрать javac
MyProg.java. Если текст программы не содержит ошибок, компилятор
создаст файл с таким же именем, но с расширением .class (байт-код
программы). Теперь эту программу можно запустить с помощью Java VM
(файл java.exe). Для этого нужно в командной строке набрать java
MyProg (расширение файла не указывается).
Специальными компановщиками из файлов байткода и файлов
ресурсов могут формироваться, например, файлы приложений для

2.

мобильных телефонов (расширение .jar) или установочные файлы
приложений для операционной системы Android (с расширением .apk).
Файлы байткода исполняются виртуальной машиной Java (Java VM).
Для каждой операционной системы или устройства разрабатывается своя
Java VM, в то время как байт-код программы остается неизменным (см.
рис. 1.2).
Текст программы на языке java
Компилятор javac
Байт-код программы)
Java VM для Windows
Java VM для Linux
Java VM для Mac OS
Запуск на ОС Windows
Запуск на ОС Linux
Запуск на Mac OS
Рис. 1.2. Запуск приложений на различных платформах при помощи Java
VM
1.2. Java и объектно-ориентированное программирование
В отличии от других языков программирования, например C++, PHP,
где объектно-ориентированное программирование можно использовать,
если есть желание, в языке программирования Java каждая программа –
объектно-ориентированная.
Основная конструкция языка программирования Java, основной
объект, с которым можно что-то делать – это класс. У каждого класса есть
какие-то характеристики, называемые полями (другими словами –
переменные) и умения что-то делать, называемые методами (другими
словами - функции). На рис. 1.3 приведен пример текста простой
программы, где есть метод и переменная.
public class wasinkharkov{
public static void main(String[] args) {
int n=5;
System.out.println(“I was in Kharkov! “+n+”
times!”);
}
}
Рис. 1.3. Текст простой программы на языке Java

3.

При запуске эта программа выдает в консольном окне надпись “I
was in Kharkov! 5 times!”. Если Вы запускаете программу из
командной строки Total Commander, то для запуска нажимайте
комбинацию клавиш Shift+Enter. Иначе консольное окно сразу же
закроется.
В приведенной программе wasinkharkov – это класс, main – это
метод, n – поле.
Ключевое слово public объясним чуть позже.
В каждой программе, которую мы собираемся запускать на
выполнение, должен быть метод main. Этот метод будет выполнен при
запуске программы.
Объявление класса {
Объявление полей…
Описание методов…
Описание метода main
}
Если не планируется, что программу будут запускать на выполнение,
а описанный класс лишь будет использоваться в других программах, то
наличие в тексте метода main не обязательно.
Покажем теперь, как класс из одной программы можно использовать
в другой программе. На рис. 1.4 приведен текст программы khai.java.
public class khai {
public void reklama(String NapravlenieObuchenija, int
ChisloBudzhetnyhmest) {
System.out.println("В ХАИ около 10 000 студентов
учатся по более, чем 50 направлениям обучения.");
System.out.println("Одним из этих направлений
является направление "+NapravlenieObuchenija);
System.out.println("Число бюджетных мест по этому
направлению: "+ChisloBudzhetnyhmest);
}
}
Рис. 1.4. Текст программы khai.java

4.

В этой программе описан класс khai и метод reklama. Обратим
внимание, что метода main в тексте программы нет, поэтому ее нельзя
запустить на выполнение. Однако, эту программу можно откомпилировать
в байт-код и в дальнейшем вызывать ее метод reklama из других
программ.
Отметим, что у метода реклама два входных параметра. Во-первых,
это поле NapravlenieObuchenija типа String (текстовая строка). Вовторых, это поле ChisloBudzhetnyhmest типа int (целое число).
На рис. 1.5 приведен текст программы telek.java, которая вызывает
метод reklama из программы khai.java.
public class telek{
public static void main(String[] args) {
khai k=new khai();
k.reklama("Телекоммуникации",30);
}
}
Рис. 1.5. Текст программы telek.java
Обратите внимание, чтобы использовать методы класса khai, нужно
создать экземпляр этого класса. Это делается в строке:
khai k=new khai();
При этом создается экземпляр k класса khai.
В общем виде создание экземпляра заданного класса выглядит так:
имя_класса имя_переменной=new имя_класса()
Нужно просто запомнить эту конструкцию и использовать ее всякий
раз, когда нужно создать новый экземпляр какого-то класса. И ключевое
слово new как раз и говорит виртуальной машине Java о том, что в памяти
выделяется место под новый экземпляр класса.
Теперь с помощью k можно вызывать метод reklama: k.reklama
При запуске откомпилированной программы telek она выведет на
экран текст:
В ХАИ около 10 000 студентов учатся по более, чем 50
направлениям обучения.
Одним
из
этих
направлений
является
направление
Телекоммуникации
Число бюджетных мест по этому направлению: 30

5.

1.2.1. Наследование и изменение класса. Полиморфизм
Создадим файл khaibest.java со следующим текстом (см. рис. 1.6):
public class khaibest extends khai {
public void reklama(String NapravlenieObuchenija, int
ChisloBudzhetnyhmest) {
super.reklama(NapravlenieObuchenija,
ChisloBudzhetnyhmest);
System.out.println(NapravlenieObuchenija+" - это
лучшее направление обучения в ХАИ!");
}
}
Рис. 1.6. Текст программы khaibest.java
Ключевое слово extends означает, что класс khaibest наследует
(копирует) класс khai:
class khaibest extends khai
Класс, который наследует еще называется классом-потомком, а
класс, которого наследуют - классом-родителем.
Наследовав от класса khai его поля и методы, в классе khaibest мы
имеем право оставить любой из них без изменения, либо дополнить, либо
полностью изменить, переписав заново. В этом состоит полиморфизм
объектного программирования на Java.
Если мы хотим дополнить какой-то метод, для запуска его старой
версии предусмотрено ключевое слово super. Формат его использования:
super.имя_родительского_метода
В данном примере метод super позволяет вызвать неизмененный
метод родительского класса reklama. Таким образом, super.reklama
означает вызов метода reklama наследуемого класса khai из файла
khai.java.
На рис. 1.7 приведен текст программы, использующий класс khaibest.
public class telek2{
public static void main(String[] args) {

6.

khaibest k=new khaibest();
k.reklama("Телекоммуникации",30);
}
}
Рис. 1.7. Текст программы telek2.java
После компилирования и запуска этой программы на экран будет
выведена надпись:
В ХАИ около 10 000 студентов учатся по более, чем 50
направлениям обучения.
Одним
из
этих
направлений
является
направление
Телекоммуникации
Число бюджетных мест по этому направлению: 30
Телекоммуникации - это лучшее направление обучения в ХАИ!
Приведем более сложный пример, однако, позволящий нам до конца
разобраться с полиморфизмом. На рис. 1.8 приведе текст класса
puktir.java.
public class punktir {
public void line1() {
System.out.print("---");
}
public void line2() {
System.out.print("=");
}
public void PunktirLine(int dlina) {
for (int i=0;i<dlina;i++)
{
line1();
line2();
}
}
}
Рис. 1.8. Текст программы punktir.java

7.

На рис.1.9 приведен текст программы, которая использует класс
punktir.
public class tst{
public static void main(String[] args) {
punktir p=new punktir();
p.PunktirLine(5);
}
}
Рис. 1.9. Текст программы tst.java, использующей класс punktir
При запуске программы tst.class мы увидим на экране вот такое
подобие пунктира:
---=---=---=---=---=
Теперь создадим класс punktir2 (см. рис. 1.10), который наследует
punktir и заменим текст одного из методов, например, line2.
public class punktir2 extends punktir {
int num=1;
public void line2() {
for (int i=0;i<num;i++) System.out.print("o");
num++;
}
}
Рис. 1.10. Текст программы punktir2.java
Обратите внимание, что в классе-потомке punktir2 описывается
только метод line2, а методы line1 и PunktirLine вообще не
упоминаются. Это значит, что эти не упомянутые методы остались
неизменными, такими же, как и в родительском классе.
Метод line2 полностью изменен в классе-потомке. Тем не менее он
точно так же, как и раньше будет без проблем вызываться из метода
PunktirLine.
На рис. 1.11 приведе текст программы tst2.java, использующий новый
класс punktir2.java.

8.

public class tst2{
public static void main(String[] args) {
punktir2 p=new punktir2();
p.PunktirLine(5);
}
}
Рис. 1.11. Текст программы tst2.java
При запуске программы tst2.class мы увидим следующую строку:
---o---oo---ooo---oooo---ooooo
Как видно, вместо символов “=”, которые выводил метод line2 в
родительском классе, в классе-потомке punktir2 выводится постепенно
увеличивающееся количество символов “o”.
Основной вывод, который мы должны извлечь из этого примера - в
классе-потомке необходимо привести текст только тех методов, которые
мы хотим изменить по сравнению с родительским классом, или которых
не было в родительском классе. Все остальные методы достаются классупотомку от класса-родителя полностью автоматически. И приводить их
текст в классе-потомке, конечно же, не нужно.
1.2.2. Модификаторы public, private, protected
Как мы уже заметили, перед именами классов, методов и
переменных у нас часто стоит служебное слово public. Так вот, это
служебное слово сообщает компилятору Java, что помеченные им метод
или поле можно без ограничений использовать в других классах (в других
программах). Кроме служебного слова public, есть еще другие
служебные слова, в частности private и protected. Вот, что означают
эти слова:
public
– методы и поля видно и можно использовать где угодно;
private
– методы и поля видно и можно использовать только в
этом классе;
protected – методы и поля видно и можно использовать только в
этом классе или в классах, наследующих его с помощью
extends.
Для чего это все нужно? Модификаторы private и protected
нужны, чтобы защитить поля от случайного изменения из других
программ, которые используют класс.

9.

Когда это нужно? Если речь идет о написании небольшой программы
одним человеком, то все поля и методы спокойно можно помечать как
public. Скорее всего этот один человек не запутается в своем коде
программы.
Теперь представим, если речь идет о создании большого проекта,
где десятки программистов совместно трудятся над созданием
программного кода, причем каждый из них пишет свои классы, но
приходится вызывать методы и из классов, написанных кем-то другим.
Вэтом случае запросто может возникнуть ситуация, когда в тексте своего
класса программист Вася дал какому-то полю название Value, и,
одновременно, программист Петя дал названия Value одному из полей
своего класса. В этом случае при присвоении полю Value какого-то
значения вполне может возникнуть путаница, в результате чего весь
сложный проект будет работать неправильно и потребуются
значительные усилия для его отладки и выявления ошибки.
Использование же в таких больших проектах модификаторов private
или protected позволяет защитить поля и методы от случайного
изменения из другого класса.
Крайне рекомендуется защищать все поля классов модификатором
private, а также защищать этим модификатором большинство методов,
которые не предполагается в дальнейшем использовать из других
классов. Причем даже начинающий программист на Java, который пишет
небольшие программы просто для тренировки, с самого начала должен
приучать себя к этому правилу. Тогда при поступлении на работу в
серьезную фирму ему будет легко и привычно выполнять требования по
написанию грамотного (с точки зрения надежности) кода.
Рассмотрим на примере использование модификатора private. На
рис. 1.12 приведе текст класса factorial, а на рис. 1.13 - класса test,
который его использует.
public class factorial {
private int limit=10;
public void demo() {
int r=1;
for (int i=2;i<=limit;i++) r=r*i;
System.out.println("Факториал от значения "+limit+"
равен "+r);
}
}
Рис. 1.12. Текст программы factorial.java

10.

public class test{
public static void main(String[] args) {
factorial k=new factorial();
k.demo();
}
}
Рис. 1.13. Текст программы test.java
Метод demo() выводит на экран результат вычисления факториала
от числа 10. Это число хранится в поле limit, защищенном
модификатором private. Ни прочитать, ни изменить значения этого поля
из класса test невозможно. При попытке вставить в текст метода main
класса test, например, строку k.limit=6; компилятор javac выдаст
ошибку.
Каким
же
образом,
не
нарушая
принципа
надежного
программирования (все поля должны быть помечены private) тем не
менее разрешить из других классов изменять значения полей? Очень
просто - написать метод, который их изменяет. На рис. 1.14 приведена
модификация класса factorial, позволяющая менять значение поля
limit.
public class factorial {
private int limit=10;
public void ZadatxLimit(int value) {
limit=value;
}
public void demo() {
int r=1;
for (int i=2;i<=limit;i++) r=r*i;
System.out.println("Факториал от значения "+limit+"
равен "+r);
}
}
Рис. 1.14. Модифицированный текст программы factorial.java

11.

Здесь прописан новый метод ZadatxLimit, который меняет
значение поля limit на value (входное данное метода).
На рис. 1.15 приведена модифмкация текста программы test.java, в
которой используется метод ZadatxLimit.
public class test{
public static void main(String[] args) {
factorial k=new factorial();
k.ZadatxLimit(6);
k.demo();
}
}
Рис. 1.15. Модифицированный текст программы test.java
В этом случае компилятор не выдаст никакой ошибки, так как
прямого обращения к полю limit в классе test нет, а изменение этого
поля происходит внутри одного из методов класса factorial, что
разрешается модификатором private, так как это поле декларировано
именно в этом классе.
В результате модифицированная программа test.java выводит на
экран значение факториала для числа 6.
1.2.3. Инкапсуляция. Доступ к полям только через методы
Только что рассмотренный нами пример на рис. 1.12 - 1.15
иллюстрирует термин инкапсуляция, часто упоминающийся при
изложении
принципов
грамотного
программирования
на
Java.
Инкапсуляция как раз и подразумевает, что все поля нужно защищать
модификатором private, а для чтения и изменения их значений
создавать специальные методы.
Использование при программировании инкапсуляция позволяет
повысить надежность больших программ на Java. В то же время
инкапсуляция - это подход к программированию, а не обязательное
требование. Как уже отмечалось, если программист пишет маленькую
программку для себя, то для уменьшения длины текста этой программы
инкапсуляции можно не придерживаться.
1.2.4. Интерфейсы
Интерфейс – это скелет (заготовка) класса с перечислением
необходимых методов, но без их кода. Класс можно наследовать и

12.

использовать. Для интерфейса же нужно, чтобы кто-то создал класс,
написав в нем тексты заявленных методов. И только после этого он (этот
класс) будет пригоден к использованию.
На рис. 1.16 приведен пример интерфеса primer, на рис. 1.17пример реализации этого интерфейса классом test, а на рис.1.18 пример класса ura, в котором используется класс test.
interface primer {
void Privet();
void Poka();
}
Рис. 1.16. Текст интерфейса primer.java
public class test implements primer {
public void Privet() {
System.out.println("Здравствуйте!");
}
public void Poka() {
System.out.println("До свидания!");
}
}
Рис. 1.17. Текст класса test.java
public class ura {
public static void main(String[] args) {
test t=new test();
t.Privet();
}
}
Рис. 1.18. Текст класса ura.java
В тексте класса, который реализует (имплементирует) интерфейс,
должны быть написаны тексты всех методов, декларированных в этом
интерфейсе. Класс может реализовывать сразу несколько интерфейсов. В
этом случае они указываются через запятую после слова implements.
Интерфесы нужны в жизни опять таки при разработке больших
программ большими коллективами программистов. Главный программист
Федя, например, прописывает несколько интерфейсов, объясняет, что там
нужно сделать рядовым программистам Васе и Пете, а они уже затем
подробно расписывают классы, реализующие эти интерфейсы. Таким

13.

образом экономится труд квалифицированных
облегчается планирование работы.
программистов
и
1.3. Пакеты
Иногда для больших проектов можно задать имя класса, например,
Dog, а оно уже существует (другой программист создал класс с таким же
именем). Чтобы таких конфликтов не было, в Java предлагается
использовать пакеты.
Чтобы использовать пакет, нужно перед объявлением класса
вставить объявление пакета, например, так:
package papa;
public class khai {
При этом текст программы этого класса нужно сохранить в папку с
таким же именем, как у пакета.
Использовать класс из пакета можно двумя способами. Первый из
них, ставить перед именем используемого класса имя пакета с точкой:
public class telek {
public static void main(String[] args) {
papa.khai k=new papa.khai();
k.reklama("Телекоммуникации",30);
}
}
Второй способ - вставить в начале программы ключевое слово
import с названием пакета, вот так:
import papa.*;
public class telek2 {
public static void main(String[] args) {
khai k=new khai();
k.reklama("Телекоммуникации",30);
}
}
На практике используйте тот из этих способов, который кажется Вам
более удобным в каждом конкретном случае.
Основными стандартными пакетами Java, с которыми нам придется
иметь дело, являются:
java.lang
- базовая функциональность языка и основные типы

14.

java.util
- коллекция классов структур данных
java.io
- операции ввода-вывода
java.math - математические операции
java.nio
- новый фреймворк для ввода-вывода
java.net
- операции с сетями, сокетами, DNS-запросами
java.security - генерация ключей, шифрование и дешифрование
java.sql
- Java Database Connectivity (JDBC) для доступа к базам
данных
java.awt
- иерархия основных пакетов для родных компонентов GUI
javax.swing - иерархия пакетов для платформенной независимости GUI
компонентов
English     Русский Правила