Java

Материал из Викиучебника

Перейти к: навигация, поиск
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:\>_


[править] Ссылки

Источник — «http://ru.wikibooks.org/wiki/Java»
На других языках