sssanay
Главная страница
Статьи о создании сайта
Статьи о раскрутке сайта
Учебник по Java Script
Юмор
ssss
 
 
 
 

Язык и архитектура Java

Свойства, присутствующие в С и С++, и удаленные из Java

Конструкция typedef, препроцессор
Конструкция typedef была унаследована С++ из С. Из Java она выброшена совсем.
Необходимость в макропроцессоре также во многом отпала при написании программ на С++. Почти все, для чего использовались макрорасширения, можно было сделать более элегантным и надежным образом, используя конструкции самого языка.
Система неявно поощряла создание каждым программистом своего собственного подмножества языка, неизвестного остальному миру. По мере разрастания кодов увеличивается тот смысловой контекст, в котором компилятор интерпретирует каждую строку программы. Уже в проектах среднего размера существенно возрастает нагрузка на компилятор, не говоря уже о нагрузке на память программиста.
Единственная оставшаяся важная функция препроцессора -- позволить включение в программу файлы-заголовки с описаниями классом. Эта операция может быть выполнена более просто и эффективно, если позволить компилятору читать подготовленные бинарные файлы с описанием классов. Последний путь был выбран при создании языка Java.
Все эти соображения позволили полностью исключить необходимость использования текстового препроцессора в языке Java.
Struct и union
Структуры не имеют смысла в Java, их роль полностью выполняют классы. Использование конструкций типа union для типизованных объектов также больше не нужно -- язык позволяет определить тип объекта при исполнении программы.
Функции
В этом смысле Java чисто объектно-ориентированная система. Функции и процедуры, не привязанные к контексту какого-либо объекта, больше не присутствуют в системе. В ситуации, когда функция логически не привязана к определенному экземпляру класса, она может быть создана как метод самого класса (т.е. иметь тип static).
Множественное наследование
Последовательная реализация концепции множественного наследования в С++ привела к существенным сложностям как в создании компиляторов, так и в использовании его (множественного наследования) в программах. В качестве альтернативы Java использует понятие интерфейса определяющего набор методов, которые должны быть определены в классе, реализующем этот интерфейс. Интерфейс может также содержать определение некоторых констант.
То, чего интерфейс содержать не может -- это реализации методов или изменяемые поля данных. Классы, которые объявлены, как реализующие тот или иной интерфейс, обязаны реализовать все методы, объявленные в интерфейсе.
Goto
см. выше описание операторов continue и break с меткой.
Перегрузка операторов
Опыт использования перегруженных операторов в С++ показывает, что они имеют смысл в довольно ограниченном наборе ситуаций. С другой стороны, злоупотребление этим свойством может сделать программу абсолютно непонятной. Единственное "встроенное" в язык Java исключение -- возможность использования оператора "+" для склеивания строк (см. выше).
Автоматическое преобразование типов
В языке Java запрещено автоматическое преобразование типов, широко используемое (и рекомендуемое) в С++. Чтобы преобразовать элемент одного типа в другой, необходимо указать это явно, например
 

int myInt;

double myFloat = 3.14159;

myInt = myFloat;		// допустимо в С++, недопустимо в Java

myInt = (int)myFloat;		// допустимо в Java

Исключение составляет преобразование между встроенными численными типами без потери информации.
Указатели
Большинство исследований показали, что применение указателей в С/С++ являются одним из основных источников ошибок. В силу того, что в языке больше не стало структур, а массивы и строки превратились в полноценные объекты, надобность в указателях отпала. Содержимое строк и массивов доступно только по индексам, причем контроль доступа во время выполнения не позволяет выходить за границы массива или строки.
 

Итоги

Итак, мы показали два из основных свойства языка программирования Java
 

  • знакомый -- Java сохраняет стиль программирования C и С++
  • простой -- количество конструкций языка в Java существенно сокращено по сравнению с С и С++

 

Язык Java объектно-ориентирован

Система Java создавалась объектно ориентированной с самого начала. Объектно-ориентированная парадигма наиболее удобна при создании программного обеспечения типа клиент-сервер, а также для организации распределенных вычислений.
Одна из черт, присущих объектам, заключается в том, что объекты обычно переживают процедуру, их создающую. Они затем могут перемещаться по сети, храниться в базах данных и т.д.
Идейными наследниками Java являются такие языки, как C++, Eiffel, Smalltalk и Objective C. За исключением примитивных типов данных, практически все в языке является объектом.
 

Основные требования к объектно-ориентированной системе

 

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

Объектная модель Java

Классы
Класс есть языковая конструкция, определяющая поля данных объектов данного класса (instance variables) и их поведение (methods). Практически класс в Java сам по себе не является объектом. Это лишь шаблон, который определяет, из каких частей будет состоять объект, созданный с помощью этого класса, и как он будет себя вести.
Простейший пример описания класса
 

class Point extends Object {

  public double x;

  public double y;

}

Создание объекта определенного класса
Создать объект описанного выше класса можно декларацией
 

Point myPoint;		// объявление переменной типа Point

myPoint = new Point();	// инициализация

а обратиться к полям данных следующим образом
 

myPoint.x = 10.0;

myPoint.y = 25.7;

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

class Point extends Object {

  Point() {

    x = 0.0;

    y = 0.0;

  }

  Point(double x, double y) {

    this.x = x;

    this.y = y;

  }

  public double x;

  public double y;

}

а использованы они могут быть следующим образом
 

Point a;

Point b;



a = new Point();

b = new Point(1.0, 2.0);

обратите внимание на имя this в определении конструктора с аргументами. Оно используется для обозначения самого объекта, в методе которого мы находимся, в тех случаях, когда ссылка на этот объект не подразумевается неявно.
Методы и посылка сообщений
Если один объект в программе заставляет другой выполнить какую-то операцию, то принято говорить, что он посылает сообщение другому объекту. Например, мы можем переопределить наш класс следующим образом:
 

Pclass Point extends Object {

  private double x;

  private double y;



  public void setX(double x) {

	this.x = x;

  }

  public void setН(double y) {

	this.y = y;

  }

  ...

}

Мы теперь сделали поля x и y недоступными извне класса, но для изменения их состояния предусмотрели специальные методы setX и setY.
Финализаторы
Специальное имя finalize зарезервировано для метода, который будет вызван сборщиком мусора перед тем, как объект будет уничтожен. В силу того, что Java освобождает нас от необходимости самим следить за освобождением памяти, занимаемой объектами, необходимость в таких методах обычно возникает лишь тогда, когда надо освободить какие-то внешние ресурсы, например, закрыть открытый файл:
 

protected void finalize() {

  try {

    file.close();

  } catch (Exception e) {

  }

}

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

class ThreePoint extends Point {

  protected double z;



  ThreePoint() {

    super();

    z = 0.0;

  }



  ThreePoint(double x, double y, double z) {

    super(x, y);

    this.z = z;

  }

}

Здесь мы добавили новую координату z, а поля x и y (и методы доступа к ним) унаследовали от класса Point.
Контроль доступа
Контроль доступа к данным и методам объекта в Java несколько отличается от С++. Помимо трех уровней доступа, имеющихся в С++ (public, private, protected) имеется четвертый, находящийся где-то между уровнями public и protected. Он не имеет имени и используется по умолчанию, когда явно не указан другой уровень. Поля этого типа доступны внутри только одного программного пакета. Пакет представляет группу классов, объединенных в одну логическую группу. Например, классы, описывающие точку и прямоугольник в графическом пакете, могут иметь прямой доступ к полям данных друг друга, запрещенный обычно для остального мира.
Также следует отметить, что контроль доступа в C++ помогает программисту лишь при построении программы. Различия между полями, помеченными public и private, отсутствуют в выполняемом модуле, созданном с использованием этого языка. В Java контроль доступа реален, т.к. он осуществляется не только при компиляции, но и непосредственно перед запуском кодов на выполнение виртуальной машиной.
Переменные и методы класса
Как и С++ язык Java позволяет использовать переменные и методы, принадлежащие классу целиком. Для определения их используется ключевое слово static. Естественно, что методы самого класса не могут оперировать данными и методами объекта класса, т.к. они не относятся ни к какому определенному объекту.

Например, версия реализации класса Rectangle может быть задана следующим образом:
 

class Rectangle extends Object {

  static final int version = 2 ;

  static final int revision = 0 ;

}

Ключевое слово final означает, что значение поля окончательное и изменению не подлежит (это константа).
Абстрактные методы
Абстрактные методы -- это методы, для которых в данном классе не определена их реализация. Мы указываем лишь на необходимость наличия методов с данным протоколом. Конкретная реализация должна быть осуществлена классами-наследниками. В то же время остальная, "неабстрактная" часть класса может содержать конкретную информацию, которая может быть использована производными классами. Например
 

abstract class Graphical extends Object

{

  protected Point lowerLeft;

  protected Point upperRight;

  ...

  public void setPosition(Point ll, Point ur)

  {

    lowerLeft = ll;

    upperRight = ur;

  }



  abstract void drawMyself();

}



class Rectangle extends Graphical

{

  void drawMyself()

    {

      ....      

    }

}

Здесь мы описали класс Graphical. В нем объявлено свойство всех графических элементов иметь какое-то положение на плоскости. Каждый элемент обязан также иметь метод для рисования самого себя, однако никакого метода рисования по-умолчанию быть не может. Класс Rectangle, представляющий собой конкретную реализацию для типа Graphical, реализует также этот метода для объекта прямоугольной формы.
Класс, содержащий хотя бы один абстрактный метод, должен быть объявлен как абстрактный. По понятным причинам создание экземпляров такого класса невозможно.
 

1 \ 2 \ 3 

 



Сайт управляется системой uCoz