Java
Материал из Викиучебника
Содержание |
[править] Об учебнике
От читателя требуются основные знания о программировании и общие компьютерные навыки. Справочной сводки по языку тут нет, это учебник.
Цифры-номера строк в примерах не являются частью кода.
[править] Привет, мир
Создаем файл HelloWorld.java и в любом текстовом редакторе пишем в него:
public class HelloWorld { public static void main(String[] args) { System.out.println("Здравствуй, мир!"); } }
Готово! Можем запустить программу и получим:
C:\>java HelloWorld Здравствуй, мир!C:\>_
[править] Основные понятия
[править] Класс
Класс есть ключевое понятие в объектно-ориентированном программировании, под которое и заточена Ява. Класс описывает содержание и поведение некой совокупности данных и действий над этими данными.
К примеру, если мы моделируем прямоугольную комнату классом Комната, то данными могут быть: длина, ширина и высота, двери, электророзетки, мебель. Заметим, что на уровне класса мы ещё не знаем, о которой комнате идет речь, но точно знаем, что это не ящик (который тоже имеет длину, высоту и ширину), а именно комната. Действиями могут быть: вычисление объема, помещение и изъятие мебели, открытие дверей. Чтобы вычислить объем комнаты или наклеить обои, нам не нужны ее размеры, о своих размерах каждая конкретная комната знает сама.
[править] Наследование
Классы могут наследовать свойства и данные один другого. Если существуют ящик и комната, объем которых вычисляется перемножением трех параметров - то можно определить материнский класс для двух вышеперечисленных классов, чтобы в нем определить вычисление объема, а наследники будут только пользоваться унаследованным свойством а не переписывать его несколько раз. В то же время при желании любой из наследников может перегрузить унаследованное свойство. Так например: если в комнате находится какой-то предмет и объем комнаты не должен включать объема этого предмета - то функция вычисления объема уже не будет одинаковой для ящика и комнаты.
[править] Объект
Object - это экземпляр класса. В нашем примере - это может быть какая-то конкретная комната с конкретными размерами, причем количество комнат не ограничено. Предположим у нас есть два экземпляра комнат: спальня и кабинет. Теперь мы можем совершенно не зная с какой комнатой имеем дело узнать ее объем, т.к. вычисление объема - это свойство которое работает для любой комнаты.
[править] Интерфейс
Interface описывает предполагаемое поведение класса не упоминая конкретных действий. Для нашего примера можно создать интерфейс Объемный в котором будет сказано, что класс поддерживающий данный интерфейс должен уметь возвращать объем. В таком случае мы можем сказать, что и Комната, и Ящик поддерживают интерфейс Объемный
[править] Ссылка
В других языках программирования существует несколько способов ссылаться на объекты, в Java есть только один тип ссылок, поэтому все что нужно знать - это то, что если у нас в руках есть ссылка на объект - это то же самое, что у нас в руках есть этот объект. В то же время, если мы добавляем ссылку на объект - этот объект остается неизменным и не копируется в памяти.
[править] Примитивные типы
В Java все объекты являются наследниками класса Object, кроме примитивных типов. Поэтому ссылка на Object может быть ссылкой на любой объект, кроме ниже-перечисленных:
- byte
- short
- int
- long
- float
- double
- boolean
- char
Если же требуется создать ссылку на один из базовых типов данных необходимо объявить соответствующий замещающий класс:
- Integer
- Long
- Float
- Double
- Boolean
- Character
Пример:
int I Integer oI oI = new Integer(I)
[править] От абстракции к программированию
Теперь давайте попробуем записать пример с комнатами на языке 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:\>_

