Общи характеристики на езика


В Java е добавена ключовата дума final, която, поставена пред даден елемент определя (по принцип) атрибут за непроменяемост



страница2/5
Дата25.02.2017
Размер432.83 Kb.
#15745
ТипЛекция
1   2   3   4   5

В Java е добавена ключовата дума final, която, поставена пред даден елемент определя (по принцип) атрибут за непроменяемост:


  • final променлива: Определя променлива, стойността на която не може да се променя след като е инициализирана.

Подобна на променливата с атрибут const на C++.

Декларира се с ключовата дума final :

final int aFinalVar = 0; // деклариране и инициализация

Може да се отложи инициализацията за по-късно:

final int blankfinal;

. . .


blankfinal = 0;

но след като се направи един път, опитът за промяна предизвиква компилационна грешка.

  • final клас: Класът не може да се наследява, т.е. да му се създават наследници ( subclas );

  • final метод: Методът не може да се предекларира в наследника;
    1. В Java се използва ключовата дума static която, поставена пред даден елемент, определя (по принцип) атрибут за глобална декларация (статичност):


  • static променлива: Пред променлива-статичните променливи на класа са еквивалент на глобални променливи, за които може да се създава само едно копие, независимо от това колко инстанции (обекти) от класа се създават. Действието е еквивалентно на това в C++.

  • static метод: Статичните методи се асоциират към класа, а не към обектите, негови инстанции. Той може да оперира само с членовете на класа. Действието е еквивалентно на това в C++.

Инициализация на променливите
Паметите за съхраняване на членове на клас винаги се инициализират с null. Инициализацията на прости типове като членове на клас е гарантирано в Java; ако програмистът не инициализира дадена променлива експлицитно, тя получава подразбираща се стойност (нула или еквивалентна на нула). За разлика от C++, член променливата на класа може да се инициализира направо при обявяването или в конструктора. Синтаксисът е по-логичен от този на C++ и може да се прилага както за статични, така и за не статични членове на класа. Не е необходимо да се дефинира отделно статичната член променлива извън декларацията на класа, както е в C++.
Няма предварителни декларации
В Java не се налагат предварителни декларации на данните-прости или референтни. Ако трябва да се използва клас или метод преди да се дефинира, трябва само да се използва. Компилаторът предполага че дефиницията е налична. Затова не са нужни предварителни декларации , както е в C++.
Препроцесор
Всички С/С++ компилатори имплементират стадий на компилация- препроцесор. Препроцесорът на С++ извършва основно търсене и замяна на идентификатори, които са били декларирани с директивите #define и typedef. Въпреки че повечето защитници на С++ не препоръчват използването на препроцесора, който е наследен от С, той е все още широко използван от С++ програмистите. Повечето препроцесорни дефиниции в С++ се съдържат във включени файлове, които допълват изходният (source) код – имплементационните файлове.

Недостатъкът при използването на препроцесора е, че предоставя на програмиста лесен начин да добави без да иска ненужни усложнения към програмата. Много програмисти, използващи #define и typedef в края на краищата се оказва, че са създали свой собствен под език в рамките на даден проект. Резултатът от това е, че на други програмисти им е нужно да преминат през всички включени файлове, да разгледат всички дефиниции #define и typedef, за да разберат даден код. Това води до трудности при поддръжка и използване от други програмисти. Друг проблем с препроцесора е, че той е много слаб при проверките за съвпадение на типове и тяхната валидност.



Java не предоставя препроцесор. Тя предоставя подобна функционалност (на #define, typedef и т.н.) като тази на С++, но с доста повече контрол. Константните член-променливи се използват вместо #define директивата, а дефинициите на класове – вместо typedef. Крайният резултат е, че изходният код (source) на Java е много по-логичен и лесен за четене от С++ кода.

В Java не съществуват отделни Header файлове :

Преди да се започне прехвърлянето на кода е важно да се разберат основните разлики между изходния код на в Java и C/C++. В C и C++ изходният код се създава като двойка от декларативен файл (.h) и файл имплементация (.c или .cpp). Това е направено с цел да се раздели декларацията на функциите от тяхната дефиниция. По този начин всеки програмист, използващ даден клас може да разбере кода, като прегледа декларативната част на функциите, абстрахирайки се от конкретната имплементация. (дефиницията на функциите). При Java има само един изходен код, написан във файл (.java) за всяка логическа програмна единица. Класовете на Java съдържат информацията за класовата декларация, която може да се извлече от изходния код с използването на класа javap, предоставен от разработващата среда (Java Development Kit). Затова не е необходимо разделянето на декларативния h. файл от имплементацията. Целият изходен код на класовете се пише в .java файл. Преобразуването изисква да се обединят декларацията и дефиницията в общ файл и да се преименува като .java. След това кодът се модифицира в съответствие с изискванията на езика Java. Неудобството на този подход е претрупването на спецификацията, което затруднява четенето и разбирането на кода.

В езика няма методи с атрибут inline. Компилаторът на Java определя кой от методите е такъв и няма контрол от страна на програмиста. За да се предизвика компилатора да определи метода като макрос inline се използва ключовата дума final пред метода. Самостоятелните функциите тип inline изобщо са възможни само на C++

В декларативната част на C/C++ кода могат да се поставят коментари за действието на отделните членове, т.е. документирането на кода. За облекчаване на документирането на кода, написан на Java се предоставя приложението javadoc, с което се генерира документация като HTML от коментарите, написани в кода на програмата.

Ако е нужен клас от друга библиотека се използва директивата import и името (спецификатора) на библиотеката. Не съществуват и препроцесорни макроси, подобни на тези в С и С++.
Пример 1.1 показва С++ включен файл (.h) за класа “топка”

Пример 1.1. C++ класа «топка»

// константи

#define COLOR_RED 1
#define COLOR_YELLOW 2
#define COLOR_BLUE 3
#define MATERIAL_RUBBER 1
#define MATERIAL_LEATHER 2

class ball {

// променливи
  float diameter;
  int color;
  int material;
};

За да се преобразува този клас в клас на Java е нужно само да се премахнат препроцесорните директиви #define и от точката и запетая на края на класа. Препроцесорните директиви се заменят като се декларират член-променливи на Java класа с атрибути static и final. Както е показано по-горе в Java типовете данни с ключовата дума static означават, че от тях има само едно копие за целия клас, а тези с ключовата дума final определят, че са константни, което обикновено е основният мотив за използване на #define в кода на С/С++. Пример 1.2 показва получения след трансформацията Java клас. Java версията не се записва във включен файл, защото такъв не се поддържа. В преобразуваната програма на Java дефинициите и декларациите са комбинирани в един файл, което е .java изходния файл (source).



Пример 1.2. Java класа «топка».

class ball {


  // Константи
  static final int COLOR_RED = 1;
 static final int COLOR_YELLOW = 2;
  static final int COLOR_BLUE = 3;
static final int MATERIAL_RUBBER = 1;
  static final int MATERIAL_LEATHER = 2;

  // Променливи


  float diameter;
  int color;
  int material;
}

Java версията слага всички константи в дефиницията на класа като цели числа с атрибути static и final. В самия клас, към тях се прави достъп по същия начин, както се прави достъп и в С++. Извън този клас те са недостъпни, защото са с модификатора за достъп по подразбиране. За да са видими за други класове, трябва да бъдат декларирани с модификатор за достъп public, както е показано в пример 1.3. Спецификаторите за достъп по подразбиране се разглеждат по-подробно в следващите части.


Пример 1.3. Java класа «топка» с общодостъпни (public) константи.

class ball {


  // константи
  public static final int COLOR_RED = 1;
  public static final int COLOR_YELLOW = 2;
  public static final int COLOR_BLUE = 3;
  public static final int MATERIAL_RUBBER = 1;
  public static final int MATERIAL_LEATHER = 2;

  // променливи


  float diameter;
  int color;
  int material;
}
В тази версия на класа “топка”, константите са достъпни за други класове. При използването на константите, същите се реферират чрез името на класа:
int color = ball.COLOR_YELLOW;

    1. Каталог: Course%20II -> Term%20Two -> OOP%20II
      OOP%20II -> Структурни диаграми по uml 0: Класова диаграма (Class diagram) Символи: (private) частен елемент: атрибут или метод
      Course%20II -> Приоритети на Европейския съюз в областта на компютърните и комуникационните технологии
      Term%20Two -> Конспект за изпита по дисциплината "Микропроцесорна техника"
      Term%20Two -> Б wm initdialog
      Course%20II -> Конспект по Основи на компютърните комуникации
      Term%20Two -> Задача: Езикът L е задaден чрез регулярен израз: r = ( a+b ba )( b + ab a ) ( b+ ab a) + a + b ba


      Сподели с приятели:
1   2   3   4   5




©obuch.info 2024
отнасят до администрацията

    Начална страница