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


Java няма параметризирани типове (шаблони)



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

Java няма параметризирани типове (шаблони)


Параметризираните типове дават възможност от една и съща имплементация да се създава код за различни типове на аргументите (шаблонна спецификация). Пример за това е метод, който описва операцията корен квадратен, опериращ с цели числа и реални числа. В C++, това се осигурява с шаблонни типове.

Java няма еквивалент на шаблоните в C++. Ако шаблоните се използват за създаван на подобни функции с различни типове аргументи, този недостатък може да се пренебрегне. Това в най-простия случай може да предизвика копия на един и същ код за различните аргументи. Когато обаче шаблоните се използват за автоматично генериране на класове, това е проблем, който не може да се преодолее лесно.

Друга причина за използване на шаблоните е използването им в Стандартната темплейтна библиотека. За да могат да се използват контейнерите и алгоритмите, те се параметризират по тип на съхранявания елемент. Начинът, по който се използват контейнерите в Java се разглежда в следващата част.

В последните версии на езика са отстранени недостатъците от липсата на шаблони при дефиниране на контейнери и алгоритми (версия 5.0).

import java.util.*;

import java.io.*;

public class mainapp {

public static void test(Map jm) {

System.out.println("Testing " +

jm.getClass().getName());

}

public static void main(String[] args) {



test(new HashMap());

test(new TreeMap());



}

}

Контейнери



Java няма шаблони или друга имплементация на параметризирани типове (версия 5.0 поддържа такива типове). Предоставят се три основни контейнера: Vector, Stack и Hashtable, които съхраняват референции към Object, чрез които могат да се реализират нужните контейнери, но те не са разработени с цел ефективност, като в STL на C++. Излизащите библиотеки са по-пълни, но нямат мощността и ефективността, която се постига чрез шаблонните представяния. В следваща лекция се разглежда йерархията на наследяване и образуване тези контейнерите от основните типове.

За да се направи контейнерите за съхраняване на произволни обекти в Java се използва подходът на наследяването. Както е споменато, в Java всеки обект е наследник на общия абстрактен обект Object. Контейнерите са разработени да съхраняват Object, поради което всеки наследник на този обект също може да се съхранява в контейнер. Това прави контейнерите прости за използване. За да се съхрани обект в контейнер, трябва да се съхрани референция към него в контейнера. Обектът се преобразува типа на обекта към Object и той губи своята единтичност. Когато се извлече обратно, резултатът е референция към Object, а не референцията към типа, който е съхранен в контейнера. При използване на обратно преобразуване на типа към наследения тип се получава съхранения обект. Този начин на преобразуване на типа се нарича downcasting. При преобразуване на типа надолу е известно, че например Circle е наследник на GraphicalObject. При обратното преобразуване не е известно какво точно е съхранено в контейнера, защото фактическият елемент е указател (референция) към него. Програмистът трябва да знае какво точно е съхранявал в контейнера, когато прави достъп до съдържанието, защото ще получи грешка при изпълнение. Преобразуването по време на изпълнение изисква допълнително време за да се направят проверките. Този метод изисква и допълнителна квалификация и внимание при програмиране. Решението е параметризираните типове, които са класове, които компилаторът може автоматично да избира при настройването на контейнера. Например, с параметризацирани контейнери компилаторът генерира код за контейнер, който съхранява и преминава само по базовия тип – GraphicalObject. Затова в последните версии на Java навлизат тези синтактични елементи.
    1. Java поддържа множество нишки (Multithreading )


Множеството нишки позволяват да се пише код, който потенциално може да изпълнява две или повече операции в един и същ момент от време. Например, може да се довършва четенето на голям файл, като същевременно се даде възможност на потребителя да редактира прочетена част от него. За да се осигури това, програмата се разделя на различни нишки на изпълнение. За да се направи разпределението правилно, програмата трябва внимателно да съблюдава коя от различните нишки каква част от данните променя и има ли обща памет (данни), обработвана от паралелните нишки (синхронизация).

Класовете и интерфейсите позволяват разделянето на приложението в различни нишки с няколко команди. Езикови примитиви управляват синхронизацията и заключването на критичните даннови структури и методи.



Множеството нишки на езика се осигурява с класа Thread, с който се създава наследник на нова нишка на програмата, тоест предефиниране на метода старт (run( )). Взаимното изключване на ниво обекти се осигурява с ключова дума synchronized, която се поставя пред методите. Само една нишка може да използва метода на определен обект в едно и също време. С други думи ако се въведе такъв метод, той първо заключва обекта, докато го използва срещу всички други методи с атрибут synchronized и го отключва на излизане от метода. Не е нужна специално дефинирана операция за тази цел, езикът я осигурява се автоматично. По-сложни синхронизации между нишките могат да се напишат чрез собствен клас, наречен “monitor”. Рекурсивните методи с атрибут synchronized работят коректно. Време-делението между еднакви по приоритет нишки не се гарантира.

Поради важността на работата на езика в паралелен режим на изпълнение се разглежда в следващите лекции.


    1. Java поддържа различни множества от предефинирани библиотечни класове


Средата на Java съдържа различни пакети, имплементиращи множество от фундаментални класове. Това дава добър старт в бързото програмиране на смислени приложения. Някои от основните класове са включени в следните пакети:

java.awt. Голяма част от приложенията изискват създаването на интерфейс GUI. Java предоставя абстрактен прозоречен инструментариум abstract window toolkit (awt), който позволява на програмистите на интерфейси графични обекти GUI, които могат да се използват без значение от платформата, върху която ще се изпълнява програмата. Програмите могат да се стартират автоматично на всички поддържани от езика платформи.

java.applet. Аплет в контекста на Java, е част от голяма програма, акцентираща към предоставянето предимно на някаква форма на свързана с изобразяване на данни върху браузър. Той е подклас на компонентите awt и предоставя възможности за обслужване на динамични изображения, анимации, звукови и видео обекти.

java.io. Пакетът java.io поддържа класове за четене и запис от/към потоци, файлове и програмни тръби (pipes).

java.lang. Tези класове осигуряват базовите обекти на Java и вградените прости типове данни: Class, Object, Boolean, Float, Double, Integer, String и други, плюс връзките с останалата обкръжаваща системна и операционна среда.

java.net. Пакетът предоставя класове за мрежово програмиране. Включва работата със сокети, интернет адреси, диаграми на мрежата, унифицирани позиции на ресурсите (URLs) и хендлери на данни от URL.

java.util. Това са класове за структури от данни като речници, хеширани таблици с данни, дати, стекове, битови низове и низове. Този пакет непрекъснато разширява възможностите и достига тези на на библиотеките в C++ като дава подходяща и спестяваща време имплементация на най-често използваните класове.

java.sql. Класове за работа с бази данни, основана на връзка JDBC/ODBC. Осигурява универсален интерфейс към бази от данни, свързани с драйвер към ODBC.

java.rmi. Класове за работа с класове и интерфейси, разположени в мрежата. Могат да се стартират отдалечени методи, използвайки техните именовани положения (адреси) в глобалната мрежа-технология RMI и CORBA.
    1. Изключенията са основна характеристика на Java


В C++, изключенията и прихващането им е допълнение към възможностите на езика. Много от програмистите на C++ не ги използват и не знаят как работят. Те се проявяват при грешки и не се случват при нормалното изпълнение на програмата. При незащитена от грешки програма се проявява изключение и програмата се прекъсва аварийно.

В Java, изключенията са квалифицирана част от езика. Сигнатурата на член функциите включва информация за изключението и езиковият процесор изисква да се програмира в стил на извикване на методи, които да продуцират изключения, да се проверява за наличието им да се откриват и обработват. При програмирането на Java се отчитат най-често генерираните от библиотеките изключения, защото класовете им ги предизвикват. Отношението към изключенията не е сложно, но понякога е необходимо да се предвидят. Ако бъдат пропуснати, компилаторът предупреждава за това.

Пример:

import java.util.*; // Date class



import java.io.*; // System & File IO
public class FileTest {

private void fileRead()

{

String str;



try { // C:\\jdev\\EclipseWorkspace\\TestApp\\FileApp\\FilePackage\\

RandomAccessFile fin = new RandomAccessFile ("


\\FileTest.java","r");

while((str = fin.readLine()) != null ) {

System.out.println(str);

}

fin.close();



} catch(EOFException e) {

System.out.println("End of file encountered");

}

catch(FileNotFoundException e) {



System.out.println("FileNotFound");

}

catch(IOException e) {



System.out.println("IOException encountered");

}

}



public static void main(String[] args) {

FileTest oFile = new FileTest();

oFile.fileRead();

}

}


Особености на приложения тип аплети

Поради изискванията към сигурността, понятието “приложение” е различно от “аплет” известното от С++. Основната разлика е в това, че аплетът няма права за запис на диска, защото това би означавало програма, свалена от някаква машина в Интернет да предизвика унищожаване на информацията на диска. В последните версии на езика се въвеждат цифрово подписани аплети, които се съхраняват в архивиран пакет и имат определена степен на доверяване (ако решите, може да допуснете достъпа). Трябва да се има в предвид, че те също могат да се използват като средство за атака на дисковата система.

Тъй като Java има определени ограничения в програмирането и работата с операционната среда, има трудности при програмиране на някои от частите на проекта, например достъпа до периферните устройства и тяхното управление. Това може да се реши с използването на (native interface) към методи , написани на C и C ++. Това става със специални методи, предоставящи излаз към езиците и използването на външен код. Аплетите нямат достъп до тези средства на езика, само приложенията.

Документиране на програмите

Поддържа се автоматична документация на коментарите, написани в изходния код на програмата. Ако се пише правилно коментар в кода, може да се извлече впоследствие и да се отдели от кода. Образува се документация под формата на HTML. Това е благодат за поддържащия програмата екип.



Ефективност на езика

Трудно може да се твърди, че Java може да постигне или надмине по бързодействие C++.

Основанията за това са във факта, че моделът, на който се основата програмата на C++ е статична, основана на компилатора и оптимизирана за работа в реално време. Поради това кодът, получен от C++ е по-малък, затова и по-бърз. Освен това C++ е надстройка над C, поради съвместимостта надолу, и в случай на необходимост може да се премине на функции, написани на C. Една важна особеност на работата е управлението на паметта. Базовата постановка за работа с динамичната памет при програмиране на Java е основание за подобно заключение. Известно е, че стеково базираните променливи (и обекти) се обработват по-бързо от базираните на динамична памет. При излизане от обхват на стеково базирани променливи, всички променливи, създадени в обхвата се освобождават (след извикване на деструкторите на обектите). Създаването на обекти в динамичната памет в C++ е обикновено по-бавна от същата операция при Java. Това е така, защото управлението на паметта при C++ е основано на по-разнотипни области от паметта, които трябва да се освободят. Когато се стартира delete в C++ в паметта се получават празни места, които при заемането с оператора new се претърсват за разполагане на новия обект. Процесът на търсене при динамично използване на паметта компенсира предимствата от бързодействието на стеково базирания подход. Механизмът на заемане и освобождаване на динамичната памет от JVM е по-модерен и оптимизиран с подобен на стеково-базирания подход. Тя прилича на конвейер, който се придвижва всеки път напред. Всеки нов обект, за който се заема памет попада на свободно място. Това означава, че разпределението на паметта се осигурява бързо. Указателят на паметта се премества на нова незаета позиция, което осигурява ефективност, близка до тази на стеково базирания подход. Естествено е да има допълнително време за изчисление, но то е относително малко в сравнение с търсенето на подходящ блок.

Заключение

В тази лекция се виждат различните предизвикателства, при прехвърляне на код от С и С++ към Java. Въпреки че Java е близък братовчед на С++, има достатъчно разлики, за да стане подобно прехвърляне достатъчно голям обем от работа. Ако се прави стъпка по стъпка, се вижда, че прехвърлянето не е чак толкова трудно. Нужно е само търпение и мисъл за това колко добре ще изглежда кода ви в Интернет.

Популярните публикации твърдят, че програмирането на Java е доста по-лесно за изучаване от C++, като се приема за напредък в езиковите програмни средства. Положителните страни на Java са по-прости за изучаване от тези на C++, но трудностите на повечето хора са в обучението на C++ и Java са такива и с езиците въобще.

II Част Елементи на езика

1. Контейнери

Vector


The Vector is quite simple to use, as you’ve seen so far. Although most of the time you’ll just

use addElement( ) to insert objects, elementAt( ) to get them out one at a time, and



elements( ) to get an Enumeration to the sequence, there’s also a set of other methods that

can be useful. As usual with the Java libraries, we won’t use or talk about them all here, but



be sure to look them up in the electronic documentation to get a feel for what they can do.

Стр.

Каталог: 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
отнасят до администрацията

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