У дома / Сигурност / Създаден е езикът за програмиране Java. Въведение в Java. Предимства на Java като език за програмиране

Създаден е езикът за програмиране Java. Въведение в Java. Предимства на Java като език за програмиране

Java език. Въведение.

Дълго време беше трудно да си представим компютърно списание без статия за езика Java. Дори такива популярни вестници и списания като The New York Times, The Washington Post и Business Week пишат за него.

Невъзможно е да си спомним Националното обществено радио някога да е посвещавало десетминутна програма на програмен език. Дали това е добро или лошо зависи от гледната точка. Инвестиция от 100 милиона долара в производството софтуерсъздаден с помощта на специфичен език за програмиране?! CNN, CNBC и други медии са говорили и все още говорят за това как Java може и ще го направи.

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

Първоначално имаше пропаст между рекламните обещания и реалните възможности на езика Java. С развитието на технологията стана по-стабилна и надеждна, а очакванията паднаха до разумно ниво. Езикът Java сега се използва все по-често за създаване на "междууер", който комуникира между клиенти и сървърни ресурси (като бази данни).

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

Java език като инструмент за програмиране

Как езикът за програмиране Java надхвърли своите рекламни обещания. Без съмнение това е един от най-добрите езици, достъпни за сериозни програмисти. Java има потенциала да бъде страхотен език за програмиране, но вероятно вече е твърде късно. Когато се появи нов език за програмиране, веднага възниква неприятният проблем за неговата съвместимост с предварително създаден софтуер. Освен това, дори ако промените в тези програми могат да бъдат направени без подправяне на техния текст, е трудно за създателите на език, който е толкова топло приветстван от публиката, като езика Java, директно да кажат: „Да, можем са направили грешка при разработването на версия X, но версията Y ще бъде по-добра." В резултат на това, докато чакаме да се появят допълнителни подобрения, трябва да заявим, че структурата на езика Java няма да се промени значително в близко бъдеще.

Очевидният въпрос е: Как е подобрен езикът Java?". Оказва се, че това не е направено чрез подобряване на самия език за програмиране, а чрез фундаментална промяна на библиотеките на програмите, написани на езика Java. Sun Microsystems промени всичко: от имената на отделните библиотечни функции (правейки ги по-смислени) и методите на работа на графичните модули (чрез промяна на начина на обработка на събитията и частично пренаписване на работни програми) и завършване със създаването на нови функции на езика, като средства за печат, които не са били в Java 1.0. Резултатът е много по-полезна платформа за програмиране от всички предишни версии Java език.

Microsoft пусна свой собствен продукт, наречен J++, който е свързан с езика Java. Езикът J++ се интерпретира от виртуална машина, която е съвместима с виртуалната машина на Java при изпълнение на байткод, но интерфейсите с външни кодове се различават значително между тези езици. Езиците J++ и Java имат почти същия синтаксис. Въпреки това, Microsoft създаде допълнителни езикови конструкции. Всички те са с доста съмнителна стойност, с изключение на Windows интерфейс API. В допълнение към факта, че тези езици имат един и същ синтаксис, техните основни библиотеки (низове, помощни програми, инструменти за мрежово програмиране, многонишкови инструменти, математически библиотеки и т.н.) са по същество еднакви.

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

Предимства на езика Java

1) Едно от основните предимства на езика Java е независимост от платформата, на която се изпълняват програмите: Същият код може да се изпълнява под Windows, Solaris, Linux, Machintosh и др. операционни системи.
Това е наистина необходимо, когато програмите се изтеглят през Интернет за последващо изпълнение под различни операционни системи.

2) Друго предимство е, че синтаксисът на езика Java е подобен на синтаксиса на езика C ++ и за програмисти, които знаят езици C и C ++, не е трудно да го научат. Вярно е, че за програмисти, които познават езика на Visual Basic, този синтаксис може да е необичаен.

Ако никога не сте програмирали на C++, някои от термините, използвани в този раздел, може да не са ви ясни. В този случай можете да го пропуснете. Докато стигнете до края на глава 6, тези термини ще ви станат познати.

3) Също така, Java - напълно обектно-ориентиран език, дори повече от C++. Всички обекти в езика Java са обекти, с изключение на няколко примитивни типа, като числата. (Тъй като е лесно да се разработват сложни проекти с помощта на обектно-ориентирано програмиране, то замени по-старото структурирано програмиране. Ако не сте запознати с обектно-ориентирано програмиране, глави 3-6 ще ви дадат цялата информация, от която се нуждаете за него.)

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

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

5) Въведени са истински масиви и аритметиката на показалец е забранена.
Сега програмистите по принцип не могат да изтрият данни от паметта поради злоупотребауказатели.

6) Изключена е възможността за объркване на оператора на присвояване с оператора за сравнение на равенство.
Сега дори не можете да компилирате if(ntries = 3) . . . (Програмистите на Visual Basic може изобщо да не забележат никакъв проблем тук, тъй като тази грешка е източникът на най-много объркване в C и C++).

7) Множественото наследяване е изключено. Той е заменен от нова концепция - интерфейс, заимстван от езика Objective C.
Интерфейсът дава на програмиста почти всичко, което програмистът може да получи от множествено наследяване, като същевременно избягва сложността на управлението на йерархии на класове.

Характерни особености на езика Java

прост
Тълкува се
Разпределени
Надежден
Сейф
независимо от машината
Обектно ориентиран
висока производителност
многонишков
динамичен
Компютърна архитектура е независима

Вече засегнахме някои от тези точки в последния раздел. В този раздел ще: предоставим цитати от ръководството за езика Java, разкриващи характеристиките на езика; Нека споделим с читателите някои мисли за определени свойства на езика, базирани на нашия собствен опит с последната му версия.

прост

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

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

Например синтаксисът на оператора switch на езика Java е останал непроменен. Познавайки езика C++, ще бъде лесно да преминете към синтаксиса на езика Java.
Ако обикновено използвате среда за визуално програмиране (като Visual Basic), езикът Java ще ви бъде труден.
Синтаксисът му често изглежда доста странен (въпреки че не е трудно да се разбере значението на израза). По-важното е, че когато работите на езика Java, трябва да програмирате много повече. Красотата на езика Visual Basic е, че неговата среда за визуално програмиране ви позволява почти автоматично да създавате инфраструктурата на приложението. За да постигнете същия резултат с помощта на езика Java, трябва да програмирате на ръка, но това води до много по-кратки програми.

Съществува обаче и трети вид среда за програмиране, която ви позволява да създавате програми с помощта на технологията "плъзгане и пускане".

Друг аспект на простотата е краткостта. Една от целите на езика Java е да позволи разработването на програми, които могат да се изпълняват напълно независимо на малки машини. Размерът на основния интерпретатор и поддръжка на клас е около 40 KB; стандартните библиотеки и инструменти за резба (особено самостоятелното микроядро) отнемат още 17:Kb.
Това е огромен успех. Имайте предвид обаче, че библиотеките за поддръжка на GUI са много по-големи.

Обектно ориентиран

Най-просто казано, обектно-ориентираното програмиране е техника за програмиране, която се фокусира върху данни (т.е. обекти) и средствата за достъп до тях. Правейки дърводелска аналогия, обектно-ориентираният майстор е фокусиран основно върху стола, който изработва, и едва на второ място се интересува от инструментите, необходими за това; в същото време необектно-ориентираният дърводелец мисли само за своите инструменти. Обектно-ориентираните свойства на Java и C++ са по същество еднакви.

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

Механизмите за отразяване (Глава 5) и сериализация на обекти (Глава 12) ви позволяват да внедрите постоянни обекти и инструменти за създаване на графични потребителски интерфейси, базирани на готови компоненти.

Ако никога не сте програмирали на обектно-ориентиран език, разгледайте внимателно глави 4-6. Тези глави представят основите на обектно-ориентираното програмиране и показват как то може да се използва за разработване на сложни проекти върху традиционни, процедурни езици като C или Basic.

Разпределени

Java има голяма библиотека от програми за прехвърляне на данни, базирани на TCP/IP (Transmission Control Protocol/Internet Protocol) протоколи като HTTP (Hypertext Transfer Protocol) или FTP (File Transfer Protocol). Протокол за прехвърляне на файлове). Приложенията, написани на езика Java, могат да отварят и осъществяват достъп до обекти през мрежата с помощта на иURL адреси (Uniform Resource Location - универсален адрес на ресурс) толкова лесно, колкото локална мрежа.

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

Сервлетите се поддържат от много популярни уеб сървъри. (Мрежата ще бъде разгледана във втория том.) Комуникацията между разпределени обекти на езика Java се осигурява от механизъм за извикване на отдалечени методи (тази тема също е разгледана във втория том).

Надежден

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

Това свойство също е много полезно. Компилаторът на Java език открива грешки, които на други езици се откриват само по време на изпълнение. Освен това програмистите, които са прекарали много часове в търсене на грешка за повреда на паметта поради лош указател, ще бъдат много щастливи, че по принцип такива проблеми не могат да възникнат в езика Java.

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

Сейф

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

В първото издание написахме „Никога не казвай никога“ и бяхме прави. Група експерти по сигурността от Принстънския университет откриха първите грешки в сигурността в Java 1.0 малко след като първата версия на JDK беше пусната в продажба. Освен това, както те, така и други специалисти продължиха да откриват все повече и повече грешки в механизмите за сигурност на всички следващи версии на езика Java.

Положителната страна на тази ситуация е, че Java Language Development Group обяви нулева толерантност към всякакви грешки в системата за сигурност и незабавно се зае да коригира всички проблеми, открити в механизма за защита на аплета. По-специално, публикувайки вътрешни спецификации за интерпретатора на Java език, Sun направи много по-лесно намирането на скрити грешки в сигурността и ги възложи на независими експерти.

Това увеличи вероятността всички уязвимости в сигурността да бъдат открити скоро. Във всеки случай е изключително трудно да се излъже системата за сигурност на езика Java. Намерените досега бъгове са били почти незабележими, а броят им е (сравнително) малък.

Уеб страницата за сигурност на Sun има следния URL адрес: http://java.sun.com/sfaq/.

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

1) Препълването на стека на изпълнимата програма, което беше причинено от прословутия „червей“, който се разпространи в Интернет.

2) Увреждане на области от паметта, които са извън пространството, разпределено за процеса.

3) Четене и писане на локални файлове при използване на защитен инструмент за зареждане на класове, като уеб браузър, който забранява такъв достъп до файлове.

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

С течение на времето към езика бяха добавени нови функции за сигурност. Започвайки с версия 1.1, езикът Java въведе понятието цифрово подписани класове. Използвайки клас с цифров подпис, можете да сте сигурни в неговия автор. Ако имате доверие, можете да предоставите на този клас всички привилегии, налични на вашата машина.

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

независима от архитектурата

Компилаторът генерира обектен файл, чийто формат не зависи от архитектурата на компютъра - компилираната програма може да бъде изпълнена на всякакви процесори под контрола на системата за изпълнение на програмите Java. За да направи това, компилаторът на езика Java генерира команди, байткод, които не зависят от конкретната компютърна архитектура. Байткодът е проектиран по такъв начин, че да може лесно да бъде интерпретиран от всяка машина или преведен в машинно-зависим код в движение.

Не е нова идея. Преди повече от 20 години, както системата за внедряване на Pascal, разработена от Niclaus Wirth, така и системата UCSD Pascal използваха една и съща технология. Използването на байткодове дава голяма печалба при изпълнението на програмата (въпреки това, синхронната компилация го компенсира в много случаи). Разработчиците на езика Java са свършили страхотна работа по разработването на набор от инструкции за байт код, които работят добре на повечето съвременни компютри, лесно се превежда в реални машинни инструкции.

независимо от машината

За разлика от езиците C и C++, няма аспекти на спецификацията на Java, които да зависят от системата за внедряване. Както размерът на основните типове данни, така и аритметичните операции върху тях са добре дефинирани.

Например, типът int в езика Java винаги означава 32-битово цяло число. В C и C++ типът int може да означава или 16-битово цяло число, 32-битово цяло число или цяло число с произволен размер, както е избрано от разработчика на конкретен компилатор. Единственото ограничение е, че размерът на int не може да бъде по-малък от размера на кратко int и по-голям от размера на дълго int. Фиксираният размер на числовите типове избягва много от неприятностите, свързани с стартиране на програми различни компютри. Двоичните данни се съхраняват и предават във фиксиран формат, което също така избягва недоразуменията, свързани с различен ред на байтове на различни платформи (конфликт "голям байт/малък байт"). Линиите се съхраняват в стандартен формат Unicode.

Библиотеките, които са част от системата, дефинират машинно-независим интерфейс. Например езикът предоставя абстрактен клас Window и неговите реализации за операционни системи Unix, Windows и Macintosh.

Всеки, който някога се е опитвал да напише програма, която работи еднакво добре на Windows, Macintosh и десетте разновидности на Unix, знае, че това е много трудна задача. Версията на Java направи героичен опит да реши този проблем, като предостави прост инструментариум, който адаптира общи елементи на потребителския интерфейс към голям брой софтуерни платформи. За съжаление библиотеката, върху която беше похарчен много труд, не ни позволи да постигнем приемливи резултати на различни платформи. (В същото време се появиха различни грешки в графичните програми на различни платформи.)

Това обаче беше само началото. В много приложения машинната независимост е много по-важна от сложността на графичния потребителски интерфейс. Именно тези приложения са се възползвали от въвеждането на Java 1.0. Въпреки това, GUI инструментариумът вече е напълно преработен и вече не зависи от потребителския интерфейс на хост компютъра. Нова версияпо-смислени и според нас по-привлекателни за потребителя от предишните.

Тълкува се

Интерпретаторът на Java език може да бъде изпратен до всяка машина и да изпълни байткод директно върху нея. Тъй като редактирането на връзки е по-лесен процес, програмирането може да стане много по-бързо и по-ефективно.

Може би това е предимство при разработването на приложения, но цитатът е явно преувеличение. Във всеки случай компилаторът на Java език, включен в JSDK (Java Software Development Kit), е доста бавен. (Някои компилатори от третия вид, като тези на IBM, са много по-бързи.) Скоростта на прекомпилиране е само един от факторите за ефективността на програмната среда. Сравнявайки скоростта на програмните среди на Java и Visual Basic, може да останете разочаровани.

висока производителност

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

Ако за изпълнение на байт кодове се използва интерпретатор, не трябва да използвате фразата " висока производителност". Въпреки това, на много платформи е възможен друг вид компилация, предоставена от синхронни компилатори (точно навреме компилатори-JIT). Те превеждат байт кода в машинно-зависим код, съхраняват резултата в паметта и след това го извикват когато е необходимо. Тъй като тази интерпретация се изпълнява само веднъж, този подход увеличава скоростта многократно.

Въпреки че синхронните компилатори все още са по-бавни от компилаторите, специфични за машината, те са поне много по-бързи от интерпретаторите, осигурявайки 10x или дори 20x ускорения за някои програми. Тази технология непрекъснато се подобрява и в крайна сметка може да постигне скорости, които традиционните компилатори никога няма да надминат. Например, синхронен компилатор може да определи коя част от кода се изпълнява по-често и да го оптимизира за скорост на изпълнение.

МНОГОНИШКИ

Осигурява по-добра интерактивност и изпълнение на програмата.

Ако някога сте опитвали многонишковост на друг език за програмиране, ще бъдете приятно изненадани колко лесно е да се направи в Java. Нишките на езика Java могат да се възползват от многопроцесорните системи, ако операционната система го позволява. За съжаление, реализациите на нишки в повечето платформи варират значително и дизайнерите на езика Java не полагат усилия да постигнат еднородност. Само кодът за извикване на нишки остава един и същ за всички машини; Езикът Java оставя внедряването на многонишковостта на основната операционна система или библиотека с нишки. (Потоците са описани в том 2.) Въпреки това, това е лекотата на организация многонишкови изчисленияправи езика Java толкова привлекателен за разработка на сървърен софтуер.

динамичен

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

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

Java език и интернет

Идеята е проста - потребителите изтеглят Java байт кодове от Интернет и ги изпълняват на своите машини. Java програмите, които работят в уеб браузъри, се наричат ​​аплети. За да използвате аплета, ви е необходим уеб браузър, който поддържа езика Java и може да интерпретира байткодовете. Изходният код на Java е лицензиран от Sun, което настоява за неизменност както на самия език, така и на структурата на основните му библиотеки. За съжаление реалността не е такава. Различните версии на браузърите Netscape и Internet Explorer поддържат различни версии на езика Java и някои от тези версии са значително остарели. Тази злощастна ситуация създава все повече и повече пречки в разработването на аплети, които се възползват последна версия Java език. За да разреши този проблем, Sun разработи Java Plug-in, който предоставя най-модерната среда за изпълнение на Java програми, базирани на браузърите Netscape и Internet Explorer.

Зареждането на аплет е като вграждане на изображение в уеб страница. Аплетът става част от страницата и текстът обгръща пространството, което заема. Разликата обаче е, че изображението вече е живо. Той отговаря на потребителски команди, променя своя външен види осигурява трансфер на данни между компютъра, на който се преглежда аплета, и компютъра, който контролира аплета.

Зареждането на аплет е като вмъкване на картина в уеб страница. Аплетът става част от страницата и текстът обгръща пространството, което заема. Факт е, че изображението е "на живо". Той отговаря на потребителски команди, променя външния си вид и прехвърля данни между компютъра, изпълняващ аплета, и компютъра, изпълняващ аплета.

На фиг. Фигура 1.1 показва добър пример за динамична уеб страница, която извършва сложни изчисления и използва аплет за рисуване на молекули. За да разберете по-добре структурата на молекулата, можете да я завъртите или да увеличите с помощта на мишката. Такива манипулации не могат да бъдат приложени на статични уеб страници, но аплетите го правят възможно. (Този аплет може да бъде намерен на http://jmol.sourceforge.net.)

Ориз. 1.1. Jmol аплет

Аплети могат да се използват за добавяне на нови бутони и текстови полета към уеб страница. Такива аплети обаче се зареждат бавно по телефонната линия.

Почти същото може да се направи с динамичен HTML, форми на HTML (език за маркиране на хипертекст) или скриптов език като JavaScript. Разбира се, първите аплети бяха предназначени за анимация: въртящи се глобуси, танцуващи анимационни герои, артистични текстове и т.н. Въпреки това повечето от горните могат също да правят анимирани GIF файлове, а динамичният HTML, комбиниран със скриптове, прави много повече от аплети.

В резултат на несъвместимост на браузъра и непоследователност в процеса на изтегляне чрез бавно интернет връзкаАплети, предназначени за уеб страници, не са голямо постижение. В локалните мрежи (интранет) ситуацията е съвсем различна. Те обикновено нямат проблеми с честотната лента, така че времето за зареждане на аплета не е значително. В локалната мрежа можете да изберете желания браузър или да използвате Java Plug-In. Служителите не могат да преместят програма, доставена по мрежата, на грешно място или да я инсталират неправилно, и системен администраторняма нужда да заобикаляте всички клиентски машини и да актуализирате програми на тях. Голям брой програми за управление на инвентара, планиране на ваканции, възстановяване на разходи за пътуване и други подобни са разработени от много корпорации под формата на аплети, използващи браузъри.

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

Java е език за програмиране от Sun microsystems. Първоначално разработен като език за програмиране електронни устройства, но по-късно се използва за писане на сървърни софтуерни приложения. Java програмите са кросплатформени, тоест могат да работят на всяка операционна система.

Основи на програмирането на Java

Java, като обектно-ориентиран език, следва основните принципи на ООП:

  • наследяване;
  • полиморфизъм;
  • капсулиране.

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

Особености

Кодът в езика за програмиране Java се превежда в байткод и след това се изпълнява на виртуалната машина JVM. Преобразуването в байткод се извършва в Javac, Jikes, Espresso, GCJ. Има компилатори, които превеждат езика C в байткод на Java. По този начин C приложение може да работи на всяка платформа.

Синтаксисът на "Java" се характеризира със следното:

  1. Имената на класовете трябва да започват с главна буква. Ако името се състои от няколко думи, тогава втората трябва да започва с главни букви.
  2. Ако за формиране на метода се използват няколко думи, тогава втората от тях трябва да започва с главна буква.
  3. Обработката започва с метода main() - той е част от всяка програма.

Видове

Езикът за програмиране Java има 8 примитивни типа. Те са представени по-долу.

  • Boolean е булев тип, който приема само две стойности true и false.
  • Байтът е най-малкият целочислен тип с размер 1 байт. Използва се при работа с файлове или необработени двоични данни. Има диапазон от -128 до 127.
  • Short има диапазон от -32768 до 32767 и се използва за представяне на числа. Размерът на променливите от този тип е 2 байта.
  • Int също означава числа, но размерът му е 4 байта. Най-често се използва за работа с целочислени данни, а байтът и short понякога се повишават до int.
  • Дългите се използват за големи цели числа. Възможните стойности варират от -9223372036854775808 до 9223372036854775807.
  • Float и double се използват за обозначаване на дроби. Тяхната разлика е, че float е удобен, когато не се изисква висока точност в дробната част на числото.
  • Double показва всички знаци след разделителя ".", а float - само първия.
  • String е най-често използваният примитивен тип, с който се дефинират низове.

Класове и обекти

Класовете и обектите играят важна роля в изучаването на езика за програмиране Java за начинаещи.

Класът дефинира шаблон за обект, той трябва да има атрибути и методи. За да го създадете, използвайте ключовата дума Class. Ако е създаден в отделен файл, тогава името на класа и файла трябва да са еднакви. Самото име се състои от две части: име и разширение.Java.

В Java можете да създадете подклас, който ще наследи методите на родителя. За това се използва думата extends:

  • class classname разширява superclassname();

Конструкторът е член на всеки клас, дори ако не е изрично зададен. В този случай компилаторът го създава сам:

  • public class Class( public Class()( ) public Class(String name)( ))

Името на конструктора е същото като името на класа, по подразбиране има само един параметър:

  • обществено кученце (име на низ)

Обект се създава от клас с помощта на оператора new():

  • Точка p = нова точка()

Той получава всички методи и свойства на класа, с помощта на които взаимодейства с други обекти. Един обект може да се използва няколко пъти под различни променливи.

    Точка p = нова точка()

    клас две точки(

    public static void main(String args) (

    Точка p1 = нова точка();

    Точка p2 = нова точка();

    Обектните променливи и обекти са напълно различни обекти. Обектните променливи са връзки. Те могат да сочат към всяка променлива от непримитивен тип. За разлика от C++, тяхното преобразуване на типа е строго регламентирано.

    Полета и методи

    Полетата са всички променливи, свързани с клас или обект. Те са локални по подразбиране и не могат да се използват в други класове. Операторът "." се използва за достъп до полета:

    • променлива с име на клас

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

    Реализирана е възможността за импортиране на променливи за получаване на достъп от други пакети:

    • импортирайте статично име на клас;

    Методът е подпрограма за онези класове, в които е деклариран. Описано на същото ниво като променливите. Посочено като функция и може да бъде от всякакъв тип, включително void:

    • клас Точка ( int x, y;

      void init(int a, int b) (

    В примера по-горе, класът Point има цяло число x и y, метод init(). Достъпът до методите се осъществява, подобно на променливите, с помощта на оператора "."

    • point.init();

    Свойството init не връща нищо, така че е от тип void.

    Променливи

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

    Няколко променливи могат да бъдат декларирани едновременно. За изброяването им се използва запетая:

    • int a, b, c;

    Инициализацията се извършва след или по време на декларацията:

    int a = 10, b = 10;

    Има няколко вида:

    • локални променливи (локални);
    • променливи на екземпляра (инстанционни променливи);
    • статични променливи (статични).

    Локалните променливи се декларират в методи и конструктори, те се създават по време на стартирането на последните и се унищожават след завършване. За тях е забранено да се определят модификатори на достъп и да се контролира нивото на достъпност. Те не се виждат извън декларирания блок. В Java променливите нямат първоначална стойност, така че една трябва да бъде присвоена преди първата употреба.

    Променливите на екземпляра трябва да бъдат декларирани вътре в класа. Те се използват като методи, но те могат да бъдат достъпни само след като обектът е създаден. Променливата се унищожава, когато обектът е унищожен. Променливите на екземпляра, за разлика от локалните променливи, имат стойности по подразбиране:

    • числа - 0;
    • логика - фалшива;
    • препратките са нулеви.

    Статичните променливи се наричат ​​променливи на класа. Имената им започват с главни букви и се задават с модификатора static. Те се използват като константи, съответно към тях се добавя един спецификатор от списъка:

    • финал;
    • частен;
    • обществено.

    Изпълнява се в началото на програмата, унищожена след спиране на изпълнението. Точно като променливите на екземпляра, те имат стандартни стойности, които се присвояват на празни променливи. Числата имат стойност 0, булевите имат стойност false, препратките към обекта са първоначално нулеви. Статичните променливи се извикват в следната форма:

    • ClassName.VariableName.

    Колектор за боклук

    В урока за програмен език Java за начинаещи разделът за автоматично събиране на боклук е най-интересен.

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

    Модулът за автоматично изтриване на неизползвани обекти работи във фонов режим и се стартира, когато програмата е неактивна. За да изчисти обекти от паметта, програмата спира, след като паметта се освободи, прекъснатата операция се възобновява.

    Модификатори

    Разграничаване различни видовемодификатори. В допълнение към тези, които определят метода за достъп, има модификатори за методи, променливи и клас. Методите, декларирани като частни, са налични само в декларирания клас. Такива променливи не могат да се използват в други класове и функции. Public дава достъп до всеки клас. Ако трябва да получите публичен клас от друг пакет, първо трябва да го импортирате.

    Защитеният модификатор е подобен по действие на public - отваря достъп до полетата на класа. И в двата случая променливите могат да се използват в други класове. Но публичният модификатор е достъпен за абсолютно всички, а защитеният модификатор е достъпен само за наследени класове.

    Модификаторът, който се прилага при създаване на методи, е статичен. Това означава, че генерираният метод съществува независимо от екземпляри на класа. Модификаторът Final не контролира достъпа, но показва невъзможността за по-нататъшно манипулиране на стойностите на обекта. Той забранява промяната на елемента, за който е посочен.

    Final for fields прави невъзможно промяната на първата стойност на променливата:

      public static void mthod(String args) (

      окончателно int Име = 1;

      int Име = 2;// ще изведе грешка

    Променливите с модификатор final са константи. Обикновено се пишат само с главни букви. CamelStyle и други начини не работят.

    Final for method показва забрана за промяна на метод в наследен клас:

      окончателна недействителност myMethod() (

      System.out.printIn("Здравей свят");

    Final for classes означава, че не можете да създавате наследници на клас:

      последен публичен клас клас (

    Abstract - модификатор за създаване на абстрактни класове. Всеки абстрактен клас и абстрактни методи са предназначени да бъдат допълнително разширени в други класове и блокове. Модификатор transient казва на виртуалната машина да не обработва дадената променлива. В този случай просто няма да спаси. Например, преходно int Име = 100 няма да се запази, но int b ще.

    Платформи и версии

    Съществуващи семейства езици за програмиране Java:

    • Стандартна Версия.
    • Enterprise Edition.
    • Микро издание.
    • карта.

    1. SE - е основният, широко използван за създаване на персонализирани приложения за индивидуална употреба.
    2. EE е набор от спецификации за разработка на корпоративен софтуер. Той съдържа повече функции от SE, поради което се използва в търговски мащаб в големи и средни предприятия.
    3. ME - предназначени за устройства с ограничена мощност и памет, обикновено имат малък размер на дисплея. Такива устройства са смартфони и PDA устройства, приемници цифрова телевизия.
    4. Карта - предназначена за устройства с изключително ограничени изчислителни ресурси, като смарт карти, sim карти, банкомати. За тези цели са променени байткодът, изискванията за платформата и компонентите на библиотеките.

    Приложение

    Програмите на езика за програмиране Java обикновено са по-бавни и отнемат повече оперативна памет. Сравнителен анализ на езиците Java и C показа, че C е малко по-продуктивен. След многобройни промени и оптимизации на виртуалната машина Java, тя подобри своята производителност.

    Използва се активно за приложения за Android. Програмата се компилира в нестандартен байткод и се изпълнява на виртуалната машина ART. За компилация се използва Android Studio. Тази IDE от Google е официалната IDE за разработка на Android.

    Microsoft разработи своя собствена реализация на Java Virtual Machine MSJVM. Имаше такива разлики, които нарушаваха фундаменталната концепция за кросплатформеност - нямаше поддръжка за някои технологии и методи, имаше нестандартни разширения, които работеха само на платформата Windows. Microsoft пусна езика J#, чийто синтаксис и цялостна работа са много подобни на Java. Той не отговаряше на официалната спецификация и в крайна сметка беше премахнат от стандартния инструментариум за разработчици на Microsoft Visual Studio.

    Език за програмиране и среда на Java

    Разработването на софтуер се извършва в следните IDE:

    1. NetBeans IDE.
    2. Eclipse IDE.
    3. IntelliJ IDEA.
    4. jDeveloper.
    5. Java за iOS.
    6. Geany.

    JDK се разпространява от Oracle като комплект за разработка на Java. Включва компилатор, стандартни библиотеки, помощни програми, изпълнителна система. Съвременните интегрирани среди за разработка разчитат на JDK.

    Удобно е да се пише код на езика за програмиране Java в Netbeans и Eclipse IDE. Това са безплатни интегрирани среди за разработка, подходящи са за всички Java платформи. Използва се и за програмиране в Python, PHP, JavaScript, C++.

    IntelliJ IDE от Jetbrains се разпространява в две версии: безплатна и комерсиална. Поддържа писане на код на много езици за програмиране, има добавки на трети страни от разработчици, които внедряват още повече езици за програмиране.

    JDeveloper е друга разработка на Oracle. Изцяло написан на Java, така че работи на всички операционни системи.

Въведение

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

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

За изпълнение на задачата беше предложен алгоритъм за писане на програма. Освен това този алгоритъм е внедрен в Java.

Описание на езика за програмиране Java

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

За написване на програмата за сортиране е избран езикът Java. Java е обектно-ориентиран език за програмиране, разработен от Sun Microsystems от 1991 г. и официално пуснат на 23 май 1995 г. Първоначално новият език за програмиране се нарича Oak (Джеймс Гослинг) и е разработен за потребителска електроника, но по-късно е преименуван на Java и започва да се използва за писане на аплети, приложения и сървърен софтуер.

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

Едно от основните предимства на езика Java е неговата независимост от платформата и типа компютър, на който се изпълняват програмите. Така един и същ код може да се изпълнява под операционните системи Windows, Linux, FreeBSD, Solaris, Apple Mac и т.н. Това става много важно, когато програмите се изтеглят през глобалния интернет и се използват на различни платформи. Езикът за програмиране Java може да работи не само със статични текстове и графики, но и с различни динамични обекти.

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

Освен това Java е напълно обектно-ориентиран език, дори повече от C++. Всички обекти в езика Java са обекти, с изключение на няколко примитивни типа, като числата.

Важно е също така, че е много по-лесно да се разработват програми на Java, които не съдържат грешки, отколкото в C ++.

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

За това беше направено следното:

разработчиците са елиминирали възможността за изрично разпределяне и освобождаване на памет.

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

въвеждането на истински масиви и забраната на указателите.

Сега програмистите не могат да изтрият данни от паметта поради неправилно използване на указатели.

е изключена възможността за объркване на оператора на присвояване с оператора за сравнение за равенство. По правило проблемът със знака "=" много често води до логически грешки в C и C ++, които не са толкова лесни за откриване. Особено в големи програми.

множественото наследяване е напълно изключено. Той е заменен от нова концепция - интерфейс, идеята за който е заимствана от езика Objective C.

Интерфейсът дава на програмиста почти всичко, което програмистът може да спечели от множествено наследяване, като същевременно избягва сложностите, които идват с управлението на йерархии на класове.

Последната версия е версия 1.6, която има подобрена сигурност, подобрена поддръжка за скриптовия език Mozilla Rhino, подобрена интеграция на работния плот и добавени някои нови функции при създаването на графични интерфейси.

Java и Microsoft

Следните компании се фокусират основно върху технологиите Java (J2EE), а не .NET, въпреки че се занимават и с последните: IBM, Oracle. По-специално, СУБД на Oracle включва JVM като свой компонент, осигуряващ възможност за директно програмиране на СУБД на езика Java, включително, например, съхранени процедури.

Основни функции

Пример за програма

Програма, която отпечатва "Здравей, свят!":

Публичен клас HelloWorld ( public static void main(String args) ( System .out .println ("Здравей, свят!" ) ; ) )

Пример за използване на шаблони:

Импортиране на java.util.*; публичен клас Пример ( public static void main(String args) ( // Създаване на обект от шаблон.Списък strings = нов LinkedList () ; strings.add("Здравей"); strings.add("свят"); strings.add("!"); for (String s: strings) ( System .out .print (s) ; System .out .print (" " ) ; ) ) )

Ключови идеи

Примитивни типове

В езика Java има само 8 скаларни типа: boolean, byte, char, short, int, long, float, double.

Класове обвивки за примитивни типове

Дължините и диапазоните на стойностите на примитивните типове се дефинират от стандарта, а не изпълнението и са дадени в таблицата. Типът char беше направен двубайтов за удобство на локализацията (един от идеологическите принципи на Java): когато стандартът беше формиран, Unicode-16 вече съществуваше, но не и Unicode-32. Тъй като в резултата не е останал еднобайтов тип, беше добавен нов тип байт. Типовете float и double могат да имат специални стойности и "не са число" (

Тип Дължина (в байтове) Диапазон или набор от стойности
булев неопределено вярно невярно
байт 1 −128..127
char 2 0..2 16 -1 или 0..65535
къс 2 −2 15 ..2 15 -1 или −32768..32767
международен 4 −2 31 ..2 31 -1 или −2147483648..2147483647
дълго 8 −2 63 ..2 63 -1, или приблизително −9.2 10 18 ..9.2 10 18
плува 4 -(2-2 -23) 2 127 ..(2-2 -23) 2 127 , или приблизително -3,4 10 38 ..3,4 10 38 , както и , , NaN
двойно 8 -(2-2 -52) 2 1023 ..(2-2 -52) 2 1023 , или приблизително -1,8 10 308 ..1,8 10 308 , както и , , NaN

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

Трансформации в математически операции

Езикът Java има следните правила:

  1. Ако единият операнд е от тип double, другият също се преобразува в тип double.
  2. В противен случай, ако единият операнд е от тип float, другият също се преобразува в тип float.
  3. В противен случай, ако единият операнд е от тип long, другият също се преобразува в тип long.
  4. В противен случай и двата операнда се преобразуват в тип int.

Последното правило отличава Java от по-старите реализации и C++ и прави кода по-безопасен. Така, например, на езика Java, след изпълнение на кода

Кратко x = 50 , y = 1000 ; int z = x*y;

на променливата z е присвоена стойност 50000, а не -15536, както в повечето безнадеждно остарели реализации на C и C++. В програма, компилирана от MS VC++ от версия 7, както и от много други съвременни компилатори (gcc, Intel C++, Borland C++, Comeau и др.), стойността също ще бъде 50000.

Обектни променливи, обекти, препратки и указатели

Езикът Java има само динамично създадени обекти. Освен това променливите на обектния тип и обектите в Java са напълно различни обекти. Променливите от типа на обекта са препратки, тоест неявни указатели към динамично създадени обекти. Това се подчертава от синтаксиса на декларацията на променливите. Например в Java не можете да пишете:

Двойно a[ 10 ] [ 20 ] ; Foo b(30) ;

Double a = ново двойно [10] [20]; Foo b = ново Foo(30 ) ;

По време на присвояване, преминаване към подпрограми и сравнения, обектните променливи се държат като указатели, тоест адресите на обектите се присвояват, копират и сравняват. И при достъп до полета с данни или методи на обект, използвайки обектна променлива, не се изискват специални операции за дерефериране - този достъп се извършва така, сякаш променливата на обекта е самият обект.

Обектните променливи са променливи от всякакъв тип, с изключение на простите числови типове. В Java няма изрични указатели. За разлика от указателите в C, C++ и други езици за програмиране, препратките в Java са много сигурни поради строги ограничения за тяхното използване, по-специално:

  • Не можете да конвертирате обект от тип int или друг примитивен тип в указател или препратка и обратно.
  • Забранено е извършването на операции ++, −−, +, − или всякакви други аритметични операции върху връзки.
  • Преобразуването на типа между препратките е строго регламентирано. С изключение на препратките към масиви, е разрешено само преобразуването на препратки между наследен тип и неговия потомък, а преобразуването от наследения тип към наследяващия тип трябва да бъде изрично указано и проверено за смисленост по време на изпълнение. Преобразуванията на референтни масиви са разрешени само когато са разрешени преобразувания на техните основни типове и няма конфликти на измерения.
  • В Java няма операции за вземане на адрес (&) или приемане на адрес (*). Звездичката в Java означава умножение, това е всичко. Амперсандът (&) просто означава "побитово и" (двойният амперсанд е "логически и").

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

Дублиращи се връзки и клониране

Тъй като обектните променливи са референтни променливи, присвояването не копира обекта. Така че, ако пишете

Foo foo, bar; ... bar = foo;

след това адресът ще бъде копиран от foo в bar. Тоест foo и bar ще сочат към една и съща област на паметта, тоест към един и същ обект; опитвайки се да промените полетата на обекта, посочен от foo, ще промени обекта, посочен от bar, и обратно. Ако трябва да вземете само още един копиеизходен обект, използвайте или метода (функция за член, в терминологията на C++) clone() , който създава копие на обекта, или конструктор за копиране.

Методът clone() изисква от класа да имплементира Cloneable интерфейс (вижте по-долу за интерфейси). Ако даден клас реализира Cloneable интерфейса, по подразбиране clone() копира всички полета ( малко копие). Ако искате да клонирате полета (както и техните полета и т.н.), вместо да копирате, трябва да замените метода clone(). Дефинирането и използването на метода clone() често не е тривиална задача.

Събиране на боклук

В езика Java не е възможно изрично да се премахне обект от паметта - вместо това се реализира събиране на боклук. Традиционният трик за да се даде на колектора за боклук „подсказка“ за освобождаване на паметта е да зададете променлива на null. Това обаче не означава, че обектът е заменен нула, със сигурност и незабавно ще бъде изтрит. Тази техника премахва само препратката към обекта, тоест развързва показалеца от обекта в паметта. В този случай трябва да се има предвид, че обектът няма да бъде изтрит от колектора за боклук, докато поне една препратка от използваните променливи или обекти сочи към него. Съществуват и методи за иницииране на принудително събиране на боклука, но не е гарантирано, че ще бъдат извикани от времето за изпълнение и не се препоръчват за нормална употреба.

Класове и функции

Java не е процедурен език: всяка функция може да съществува само в рамките на клас. Това се подчертава от терминологията на езика Java, където няма понятия "функция" или "членна функция" (англ. членна функция), но само метод. Стандартните функции също се превърнаха в методи. Например, в Java няма функция sin(), но има метод Math.sin() от класа Math (който съдържа, в допълнение към sin() , cos() , exp() , sqrt() , abs() и много други методи).

Статични методи и полета

За да не създавате обект от класа Math (и други подобни класове) всеки път, когато трябва да извикате sin () (и други подобни функции), концепцията статични методи(Английски) статичен метод; понякога на руски те се наричат ​​статични). Статичен метод (маркиран с ключовата дума static в описанието) може да бъде извикан без създаване на обект от неговия клас. Следователно човек може да пише

Double x = Math .sin(1) ;

Math m = new Math(); двойно x = m.sin(1) ;

Ограничението за статичните методи е, че те имат достъп само до статичните полета и методи в този обект.

Статичните полета имат същото значение като в C++: има само един екземпляр от всяко.

Окончателност

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

Абстракция

В Java методите, които не са изрично декларирани за окончателни или частни, са виртуални в терминологията на C++: извикването на метод, който е дефиниран по различен начин в базовите и наследяващите класове, винаги има проверка по време на изпълнение.

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

Интерфейси

Най-високата степен на абстракция в Java е интерфейсът. Всички методи на интерфейса са абстрактни: абстрактният дескриптор дори не е задължителен. Интерфейсът не е клас. Един клас може да наследява или разширяване(разширява) друг клас, или прилагат(реализира) интерфейс. В допълнение, един интерфейс може да наследи или разшири друг интерфейс.

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

Интерфейсите могат да се предават на методи като параметри, но обекти от техния тип не могат да бъдат създавани.

Маркерни интерфейси

Има някои интерфейси в Java, които не съдържат методи за изпълнение, но се обработват по специален начин от JVM. Това са интерфейсите:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.rmi.Remote

Шаблони в Java (генерични)

Започвайки с Java 5, езикът има общ механизъм за програмиране - шаблони, които са външно близки до C++ шаблоните. Използвайки специален синтаксис в описанието на класове и методи, можете да посочите параметри на типа, които могат да се използват в описанието като типове полета, параметри и връщани стойности на методите.

// Обща декларация на класклас GenericClass ( E getFirst() ( ... ) void add(E obj) ( ... ) ) // Използване на общ клас в кода GenericClass var = нов GenericClass () ; var.add("qwerty") ; Низ p = var.getFirst();

Разрешена е обща декларация на класове, интерфейси и методи. Освен това синтаксисът поддържа ограничени декларации на типове параметри: индикация в декларацията на конструкция на формуляра изисква параметъра на типа T за реализиране на интерфейсите A, B, C и така нататък, както и конструкцията изисква параметърът на типа T да бъде тип C или един от неговите предшественици.

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

Проверка за членство в клас

В Java можете изрично да проверите към кой клас принадлежи даден обект. Изразът foo екземпляр на Foo е вярно, ако обектът foo принадлежи на класа Foo или негов потомък, или имплементира интерфейса на Foo (или, по-общо, наследява клас, който имплементира интерфейс, който Foo наследява).

След това функцията getClass(), дефинирана за всички обекти, връща обект от тип Class. Тези обекти могат да се сравняват. Така, например, foo.getClass()==bar.getClass() ще бъде вярно, ако обектите foo и bar принадлежат на точно един и същ клас (но това не означава, че те са два идентични обекта).

В допълнение, обект от тип Class от произволен тип може да бъде получен по следния начин: Integer.class , Object.class .

Въпреки това, директното сравнение на класове не винаги е най-доброто средство за проверка за членство в класа. Често вместо това се използва функцията isAssignableFrom(). Тази функция е дефинирана върху обект от тип Class и приема обект от тип Class като параметър. По този начин, извикването на Foo.class.isAssignableFrom(Bar.class) ще върне true, ако Foo е предшественик на класа Bar. Тъй като всички обекти са наследници на тип Object, извикването на Object.class.isAssignableFrom() винаги ще върне true. Заедно със споменатите функции на обект от тип Class се използват и функциите isInstance() (еквивалент на instanceof) и cast() (преобразува параметър в обект от избрания клас).

Класови библиотеки

Инструменти за разработка на софтуер

  • JDK - в допълнение към набор от библиотеки за платформите Java SE и Java EE, той съдържа компилатор командна линия javac и набор от помощни програми, които също работят в режим на команден ред.
  • NetBeans IDE е безплатна IDE за всички Java платформи - Java ME, Java SE и Java EE. Промотирано от Sun Microsystems, разработчикът на Java, като основа за разработка на софтуер на Java и други езици (, C++, Fortran и др.).
  • Java SE и Java EE. Работи се за поддръжка на платформата Java ME в Eclipse. Популяризират се C, C++, Fortran и др.)
  • IntelliJ IDEA е търговска среда за разработка за платформите Java SE, Java EE и Java ME.

Бележки

  1. java (английски). Онлайн речник Merriam-Webster. Мериам Уебстър. - Английско произношение на думата "Java". Изтеглено на 5 юни 2009 г.
  2. Робърт Толксдорф.Езици за програмиране за JVM виртуалната машина на Java. е Research GmbH. - Онлайн каталог на алтернативни езици и езикови разширения за JVM. Изтеглено на 5 юни 2009 г.
  3. Поддръжка на виртуална машина на Microsoft Java. Microsoft (2003-09-12). - Официалното изявление на Microsoft относно програмата за поддръжка на MSJVM. Изтеглено на 5 юни 2009 г.
  4. Тод Хоф Amazon Architecture (английски) (2007-09-18). - Обсъждане на архитектурата на Amazon, използваща Java технологии. Изтеглено на 6 юни 2009 г.
  5. Amazon Elastic Compute Cloud (Amazon EC2) . Amazon Web Services LLC. - Описание на технологията и възможностите на Amazon EC2 като уеб услуга. Изтеглено на 6 юни 2009 г.
  6. Тод Хоф eBay Architecture (английски) (2008-05-27). - Обсъждане на архитектурата на eBay на платформата Java. Изтеглено на 6 юни 2009 г.
  7. Ранди Шоуп, Дан ПритчетАрхитектурата на eBay (на английски) (PDF). SD форум 2006(29.11.2006 г.). - Презентация за историята на развитието на архитектурата на eBay. Изтеглено на 6 юни 2009 г.
  8. Алън СтърнЕксклузивно интервю с техническия директор на Yandex Иля Сегалович (на английски) . CenterNetworks (2008-01-14). - Интервю с техническия директор на Yandex Иля Сегалович. Изтеглено на 6 юни 2009 г.
  9. Анатолий ОрловАрхитектура на Yandex.Search (руски) (PowerPoint). Материали от срещата на JUG в Екатеринбург(24.05.2008 г.). Изтеглено на 6 юни 2009 г.
  10. Браян ГуанБлогът на LinkedIn. Архив на блога. Граалс в LinkedIn. (Английски) . LinkedIn.com (11.06.2008 г.). - Историята на създаването на системата LinkedIn, базирана на технологията Grails Java. Изтеглено на 5 юни 2009 г.
  11. Съхранени процедури на OracleJVM и Java. Oracle Inc.. - Раздел от портала на Oracle, посветен на Java технологиите като част от сървъра на Oracle DBMS. Изтеглено на 5 юни 2009 г.
  12. Връзка към документацията за метода Object.clone().

литература

  • Монахов ВадимЕзикът за програмиране Java и средата NetBeans, 2-ро издание. - Санкт Петербург .: "BHV-Петербург", 2009. - С. 720. - ISBN 978-5-9775-0424-9
  • Джошуа Блок. Java. Ефективно програмиране = Ефективна Java. - М .: "Лори", 2002. - С. 224. - ISBN 5-85582-169-2
  • Java 2. Професионална библиотека, том 1. Основи = Core Java™ 2, том I--Основи. - 7-мо изд. - М.: "Уилямс", 2007. - С. 896. - ISBN 0-13-148202-5
  • Кей С. Хорстман, Гари Корнел. Java 2. Библиотеката на професионалистите, том 2. Съвети за програмиране = Core Java™ 2, том II – Разширени функции. - 7-мо изд. - М.: "Уилямс", 2007. - С. 1168. - ISBN 0-13-111826-9
  • Брус Екел.Философия на Java = мислене в Java. - 3-то изд. - Санкт Петербург: "Питер", 2003. - С. 976. - ISBN 5-88782-105-1
  • Хърбърт Шилд, Джеймс Холмс.Изкуството на Java програмирането = Изкуството на Java. - М .: "Диалектика", 2005. - С. 336. - ISBN 0-07-222971-3
  • Любош Бруга. Quick Java: Практически експресен курс = Luboš Brůha. Java Hotová řešení.. - M .: Наука и технологии, 2006. - S. 369. - ISBN 5-94387-282-5

Java е език за програмиране, разработен от SunMicrosystems. Java приложенията обикновено се компилират в специален байткод, така че да могат да работят на всяка виртуална машина на Java (JVM), независимо от компютърната архитектура. Официалната дата на излизане е 23 май 1995 г. Днес технологията Java предоставя средства за превръщане на статичните уеб страници в интерактивни, динамични документи и за създаване на разпределени, независими от платформата приложения.

Java програмите се превеждат в байт код, който се изпълнява от виртуалната машина на Java (JVM), програма, която обработва байт код и предава инструкции на хардуера като интерпретатор.

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

Често недостатъците на концепцията за виртуална машина включват факта, че изпълнението на байткод от виртуална машина може да намали производителността на програмата от алгоритми, реализирани на езика Java. Напоследък бяха направени редица подобрения, които леко увеличават скоростта на изпълнение на Java програми:

Прилагане на технологията за транслиране на байт код в машинен код директно по време на работа на програмата (JIT технология) с възможност за запазване на версии на класа в машинен код,

Широко използване на ориентиран към платформа код (роден код) в стандартните библиотеки,

Хардуер, който осигурява ускорена обработка на байт код (например технология Jazelle, поддържана от някои ARM процесори).



Основни характеристики на езика:

Автоматично управление на паметта;

Разширени възможности за справяне с изключителни ситуации;

Богат набор от инструменти за филтриране на вход/изход;

Набор от стандартни колекции като масив, списък, стек и т.н.;

Наличие на прости инструменти за създаване на мрежови приложения (включително използване на протокола RMI);

Наличието на класове, които ви позволяват да правите HTTP заявки и да обработвате отговори;

Вградени езикови инструменти за създаване на многонишкови приложения;

Достъп до унифицирана база данни:

На ниво индивидуални SQL заявки – на база JDBC, SQLJ;

На ниво концепция за обекти с възможност за съхранение в база данни – базирани на Java Data Objects и Java Persistence API;

Поддръжка на шаблони (започвайки от версия 1.5);

Паралелно изпълнение на програми.

1.4.3 Език за програмиране C#

През юни 2000 г. стана известно за нов език за програмиране, който се роди в недрата на Microsoft. Той стана част нова технология Microsoft нарича .NET (произнася се "Dot Net"). В рамките на тази технология се осигурява единна среда за изпълнение на програми (Common Language Runtime, CLR), написани на различни езици за програмиране. Един от тези езици, основният в тази среда, е C# (C#, четете “C-диез”, “C-диез”). С името на езика, разбира се, те искаха да подчертаят връзката му със C++, защото # е два пресичащи се плюса. Но най-вече новият език е подобен на Java. И няма съмнение, че една от причините за появата му е желанието на Microsoft да отговори на предизвикателството на Sun.

Въпреки че авторите на C# не са официално посочени, на заглавната страница на едно от предварителните издания на езиковото ръководство са посочени Андерс Хейлсберг, създателят на Turbo Pascal и Delphi, който се премести в Microsoft през 1996 г., и Скот Уилтамут.

Единната среда за изпълнение на програмата се основава на използването на междинния език IL (Intermediate Language - междинен език), който изпълнява почти същата роля като байт кода на виртуалната машина Java. Компилатори от различни езици, използвани в .NET технологията, превеждат програми в IL код. Подобно на Java байт-код, IL кодът представлява инструкциите на хипотетичен стек компютър. Но има и разлика в дизайна и използването на IL.

Първо, за разлика от JVM, IL не е обвързан с един език за програмиране. Предварителните версии на Microsoft.NET включват компилатори за C++, C#, Visual Basic. Независимите разработчици могат да добавят други езици, като създават компилатори от тези езици към IL кода.

Второ, IL не е предназначен за програмна интерпретация, а за последваща компилация в машинен код. Това ви позволява да постигнете значително по-висока производителност на програмите. Файловете, съдържащи IL код, носят достатъчно информация, за да работи оптимизиращ компилатор.

„C# е прост, модерен, безопасен за тип обектно-ориентиран език, извлечен от C и C++. C# ще бъде удобен и разбираем за програмисти, които познават C и C++. C# съчетава производителността на Visual Basic със силата на C++." Тези думи започват описанието на C#.

Обмисли технически характеристикиезик:

Компилационната единица е файл (както в C, C++, Java). Файлът може да съдържа едно или повече описания на типове: класове (клас), интерфейси (интерфейс), структури (структури), изброявания (enum), типове делегати (делегат) със или без указание за тяхното разпространение в пространствата от имена;

Пространствата от имена (namespace) регулират видимостта на програмните обекти (както в C++). Пространствата от имена могат да бъдат вложени. Разрешено е използването на програмни обекти без изрично указване на пространството от имена, към което принадлежи този обект. Достатъчно е само едно общо споменаване на използването на това пространство от имена в директивата using (както в Turbo Pascal). Има псевдоними за имена на пространства от имена в директивата using (както в езика Oberon);

Елементарни типове данни: 8-битови (sbyte, byte), 16-битови (short, ushort), 32-битови (int, uint) и 64-битови (long, ulong) цели числа със знак и без знак, единични реални числа (float) и двойна (двойна) прецизност, Unicode символи (char), булев тип (bool, несъвместим с цели числа), десетичен тип, осигуряващ 28 значими цифри с точност (десетични);

Структурирани типове: класове и интерфейси (както в Java), едномерни и многомерни (за разлика от Java) масиви, низове (низове), структури (почти същите като класовете, но поставени не в хийпа и без наследяване), изброявания, несъвместими с цели числа (както в Pascal);

Типове делегати или просто "делегати" (като процедурни типове в Module-2 и Oberon, указатели на функции в C и C++);

Типовете са разделени на референтни типове (класове, интерфейси, масиви, делегати) и типове стойности (елементарни типове, изброявания, структури). Обектите от референтни типове се разпределят в динамична памет (хийп), а променливите на референтните типове всъщност са указатели към тези обекти. В случай на типове стойности, променливите не са указатели, а сами стойности. Неявните преобразувания на типове са разрешени само ако не нарушават безопасността на типа или причиняват загуба на информация. Всички типове, включително елементарните типове, са съвместими с типа обект, който е основният клас на всички останали типове. Има имплицитно преобразуване на типове стойности към типа на обекта, наречено боксиране, и изрично обратно преобразуване - разопаковане;

Автоматично събиране на боклука (както в Oberon и Java);

Обширен набор от операции с 14 нива на приоритет. Предефиниране на операции (както в Algol-68, Ada, C++). С проверените и неотметнатите оператори можете да контролирате контрола на препълване, когато извършвате операции с цели числа;

Методи със стойностни параметри, референтни параметри (ref) и изходни параметри (out). Думите ref и out трябва да бъдат написани преди параметъра, не само в описанието на метода, но и при извикване. Наличието на изходни параметри ви позволява да контролирате изпълнението на дефиниращи присвоения. Според правилата на езика всяка променлива трябва да бъде гарантирана, че има стойност, преди да се направи опит да се използва;

Контролни оператори: if, switch, while, do, for, break, continue (както в C, C++ и Java). Инструкцията foreach, която преминава през всеки елемент от "колекцията", няколко разновидности на оператора goto jump;

Обработка на изключения (както в Java);

Свойства - елементи от класове (обекти), достъпът до които се осъществява по същия начин като полетата (можете да зададете или получите стойност), но се изпълняват чрез имплицитно наречени get и set подпрограми (както в Object Pascal - езикът за въвеждане на системата Delphi);

Индексаторите са елементи от класове (обекти), които ви позволяват да осъществявате достъп до обекти по същия начин като масивите (чрез посочване на индекс в квадратни скоби). Реализира се от имплицитно извикани процедури get и set. Например, достъпът (за четене) до символите на низ може да се осъществи като елементи на масив поради факта, че е внедрен индексатор за стандартния низ клас;

Събитията са елементи от класове (полета или свойства) от процедурен тип (делегати), към които извън класа, където са дефинирани, са приложими само операции += и -=, което ви позволява да добавяте или премахвате методи за обработка на събития за обекти от този клас;

Несигурен (небезопасен) код, използващ указатели и адресна аритметика, е локализиран в части от програмата, отбелязани с модификатора unsafe;

Предварителен процесор, който за разлика от C и C++ предоставя само средства за условно компилиране.

Разбира се, обсъжданите недостатъци на C # изобщо не лишават езика от перспективи. В много отношения е за предпочитане пред C++. Общото недоволство от езика C++, което се разпознава по самата поява на нов език, е една от основните предпоставки за успеха на C#.

Сравнявайки C# с Java, можете да видите много прилики. Вярно е, че ако системите на Java са мултиплатформени, тогава реализацията на C # съществува само за операционната система. Windows системии само един. Но, въпреки тежестта, може да се очаква, че езикът ще бъде внедрен и за други системи. В допълнение, самата платформа на Microsoft .NET с една среда за изпълнение на програма може да бъде промотирана към алтернативни архитектури, предимно към UNIX системи.

C# изглежда е по-реалистичен език от Java. За разлика от Java, той е самодостатъчен. Тоест можете да напишете всяка програма на C#, без да прибягвате до други езици. Това е възможно поради наличието на "небезопасни" блокове код, които отварят достъп директно до хардуера. В Java достъпът до съоръжения от ниско ниво трябва да използва "родни методи" (родни методи), които трябва да бъдат програмирани на други езици.

И, разбира се, перспективите за C # са свързани преди всичко с усилията, които, разбира се, Microsoft ще положи, за да го популяризира.