Об учебнике

От читателя требуются основные знания о программировании и общие компьютерные навыки. Числа-номера строк в примерах не являются частью кода.

Что и где скачать

Для компиляции и запуска программ вам понадобится JDK (Java Development Kit), который можно скачать на сайте http://www.oracle.com/technetwork/java/javase/overview/index.html компании Oracle.

Учебник и краткий справочник по Java "Полный справочник по Java. Java SE 6 Edition. Шилдт Г. 7-е издание" в формате djvu можно скачать по ссылке на странице http://libbib.org/?p=2552 и др.

Полный справочник Java™ Platform, Standard Edition 6 API Specification опубликован на сайте http://docs.oracle.com/javase/6/docs/api/index.html компании Oracle.

1. Создаем файл HelloWorld.java в любом текстовом редакторе и пишем в него:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

2. Подготовим пакет SDK или пакет JDK к работе:
2.1. Откроем окно системного ввода-вывода.
2.2. Укажем путь к папке bin с компилятором javac.exe.
2.3. Войдём в папку с исходным Java-кодом *.java.

3. Теперь надо cкомпилировать программу:

C:\>javac HelloWorld.java

Готово!

4. Можем запустить программу и получим:

C:\>java HelloWorld
Hello World!

C:\>_


Основные понятия

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

Класс

Класс есть ключевое понятие в объектно-ориентированном программировании, под которое и заточена Java. Класс описывает содержание и поведение некой совокупности данных и действий над этими данными. Объявление класса производится с помощью ключевого слова class. Пример: class < имя_класса > {// содержимое класса}.

К примеру, если мы моделируем прямоугольную комнату классом Комната, то данными могут быть длина, ширина и высота, двери, электророзетки, мебель. Заметим, что на уровне класса мы ещё не знаем, о которой комнате идет речь, но точно знаем, что это не ящик (который тоже имеет длину, высоту и ширину), а именно комната. Действиями могут быть вычисление объема, помещение и изъятие мебели, открытие дверей. Чтобы вычислить объем комнаты или наклеить обои, нам не нужны ее размеры, о своих размерах каждая конкретная комната знает сама.

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

Классы могут наследовать методы и данные один другого. Наследование реализуется с помощью ключевого слова extends (class <имя_класса> extends <имя_суперкласса>). Если существуют ящик и комната, объем которых вычисляется перемножением трех параметров, то можно определить материнский класс для двух вышеперечисленных классов, чтобы в нем определить вычисление объема, а наследники будут только пользоваться унаследованным свойством, а не переписывать его несколько раз. В то же время при желании любой из наследников может перегрузить унаследованное свойство. Так, например, если в комнате находится какой-то предмет и объем комнаты не должен включать объема этого предмета, то функция вычисления объема уже не будет одинаковой для ящика и комнаты.

Объект

Object - это экземпляр класса. В нашем примере это может быть какая-то конкретная комната с конкретными размерами, причем количество комнат не ограничено. Предположим, у нас есть два экземпляра комнат: спальня и кабинет. Теперь мы можем, совершенно не зная, с какой комнатой имеем дело, узнать ее объем, т.к. вычисление объема - это свойство, которое работает для любой комнаты.

Интерфейс

Interface описывает предполагаемое поведение класса, не упоминая конкретных действий. Создаётся интерфейс с помощью ключевого слова interface ( interface <имя_интерфейса>. Для того чтобы унаследовать (реализовать) классом интерфейс, используется ключевое слово implements (class <имя_класса> implements <имя_интерфейса>).А между собой интерфейсы унаследуются всё тем же словом extends. Для нашего примера можно создать интерфейс Объемный, в котором будет сказано, что класс, поддерживающий данный интерфейс, должен уметь возвращать объем. В таком случае мы можем сказать, что и Комната, и Ящик поддерживают интерфейс Объемный

Ссылка

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

От абстракции к программированию

Теперь давайте попробуем записать пример с комнатами на языке Java. Сначала создадим интерфейс.

interface Capacity {
    public double getCapacity(); //Заметим, что у функции пока нет тела
}

Класс комната и ящик поддерживают интерфейс Capacity и могут выглядеть так:

class Room implements Capacity {
    public double width;
    public double height;
    public double length;

    public double getCapacity() {
        return width*height*length;
    }		
}

class Box implements Capacity {
    public double width;
    public double height;
    public double length;

    public double getCapacity() {
        return width * height * length;
    }		
}

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

class Base implements Capacity {
    public double width;
    public double height;
    public double length;

    public double getCapacity() {
        return width * height * length;
    }		
}

class Box extends Base {
}

class Room extends Base {
}

Допустим, что в любой комнате обязательно находится один объект определенного объёма и объем комнаты не включает объема данного объекта. Тогда класс Room будет выглядеть так:

class Room extends Base {
    public Capacity inner;

    public double getCapacity() {
        return super.getCapacity() - inner.getCapacity();
    }		
}

Обратите внимание, что мы перегрузили функцию getCapacity (строки 4-6) и теперь объем комнаты не включает объема внутреннего объекта.

Ну вот и пришло время проверить все то, что мы написали. Для проверки создадим еще один класс.

class Test {
    public static void main(String[] args) {
        Box box1 = new Box();
        box1.width = 1.0;
        box1.height = 2.0;
        box1.length = 3.0;
        Room workRoom = new Room();
        workRoom.width = 10.0;
        workRoom.height = 20.0;
        workRoom.length = 30.0;
        workRoom.inner = box1;
        System.out.println("Объем ящика : " + box1.getCapacity());
        System.out.println("Объем комнаты : " + workRoom.getCapacity());
    }
}

Запускаем:

C:\>java Test
Объем ящика : 6.0
Объем комнаты : 5994.0
C:\>_


Ссылки