Дипломная работа: Створення навчальної програми по вивченню іноземної мови
Java повністю знімає цю турботу з програміста. Автоматичний збиральник сміття зобов'язаний бути вбудований в run-time системи. Пам'ять об'єктів, на які більше немає посилань, врешті-решт повертається в систему.
Досвід показує, що не дивлячись на відносну складність збиральників сміття, продуктивність системи в цілому може опинитися не менше, а часто і більше, ніж при явному звільненні пам'яті програмою.
Одна з переваг того, що Java-програми багатопотокові, полягає в тому, що збірка сміття може проводитися у фоновому потоці. Цей потік має менший пріоритет виконання, чим інші, тому система завжди готова відповісти на дії користувача, відсутні “періоди бездіяльності”, в які проводиться тільки збірка сміття.
З іншого боку, паузи в операціях користувача збиральник сміття може використовувати для своєї роботи, забезпечуючи наявність вільної пам'яті в моменти, коли це необхідно.
Java підтримує багатопотоковість не тільки на рівні бібліотек, але і на рівні самої мови, що значно полегшує побудову додатків, що надійно працюють в багатопотоковому режимі.
Конструкція typedef була успадкована С++ з С. Із Java вона викинута зовсім.
Необхідність в макропроцесорі також багато в чому відпала при написанні програм на С++. Майже все, для чого використовувалися макророзширення, можна було зробити елегантнішим і надійнішим чином, використовуючи конструкції самої мови.
Система неявно заохочувала створення кожним програмістом своєї власної підмножини мови, невідомої решті світу. У міру розростання кодів збільшується той смисловий контекст, в якому компілятор інтерпретує кожен рядок програми. Вже в проектах середнього розміру істотно зростає навантаження на компілятор, не говорячи вже про навантаження на пам'ять програміста.
Єдина важлива функція препроцесора, що залишилася — дозволити включення в програму файлів-заголовків з описами класів. Ця операція може бути виконана просто і ефективно, якщо дозволити компілятору читати підготовлені бінарні файли з описом класів. Останній напрямок був вибраний при створенні мови Java.
Всі ці міркування дозволили повністю виключити необхідність використання текстового препроцесора в мові Java.
Структури struct і union не мають сенсу в Java, їх роль повністю виконують класи. Використання конструкцій типу union для типізованих об'єктів також більше не потрібне — мова дозволяє визначити тип об'єкту при виконанні програми.
В цьому сенсі Java чисто об'єктно-орієнтована система. Функції і процедури, не прив'язані до контексту якого-небудь об'єкту, більше не присутні в системі. За ситуації, коли функція логічно не прив'язана до певного екземпляра класу, вона може бути створена як метод самого класу (тобто мати тип static).
Послідовна реалізація концепції множинного наслідування в С++ привела до істотних труднощів як в створенні компіляторів, так і у використанні його (множинного наслідування) в програмах. Як альтернатива Java використовує поняття інтерфейсу, що визначає набір методів, які повинні бути визначені в класі, що реалізовує цей інтерфейс.
Інтерфейс може також містити визначення деяких констант.
Те, чого інтерфейс містити не може, — це реалізації методів або змінні поля даних. Класи, які оголошені, що реалізують той або інший інтерфейс, зобов'язані реалізувати всі методи, оголошені в інтерфейсі.
Досвід використання перевантажених операторів в С++ показує, що вони мають сенс в досить обмеженому наборі ситуацій. З іншого боку, зловживання цією властивістю може зробити програму абсолютно незрозумілою. Єдине “вбудоване” в мову Java виключення — можливість використання оператора “+” для склеювання рядків.
В мові Java заборонено автоматичне перетворення типів, широко використовуване (і рекомендоване) в С++. Щоб перетворити елемент одного типу в іншій, необхідно вказати це явно, наприклад: int myInt; double myFloat = 3.14159; myInt = myFloat; // допустимо в С++, неприпустимо в Java myInt = (int)myFloat; // допустимо в Java. Виняток становить перетворення між вбудованими чисельними типами без втрати інформації.
Більшість досліджень показали, що застосування покажчиків в С/С++ є одним з основних джерел помилок. Внаслідок того, що в мові більше не стало структур, а масиви і рядки перетворилися на повноцінні об'єкти, потреба в покажчиках відпала.
Вміст рядків і масивів доступно тільки по індексах, причому контроль доступу під час виконання не дозволяє виходити за межі масиву або рядка.
Отже, ми показали дві з основних властивостей мови програмування Java:
- знайомий — Java зберігає стиль програмування C і С++;
- простий — кількість конструкцій мови в Java істотно скорочена в порівнянні із С і С++;
Система Java створювалася об'єктною орієнтованою із самого початку. Об'єктно-орієнтована парадигма найбільш зручна при створенні програмного забезпечення типу клієнт-сервер, а також для організації розподілених обчислень.
Одна з рис, властивих об'єктам, полягає в тому, що об'єкти зазвичай переживають процедуру, що їх створює. Вони потім можуть переміщатися по мережі, зберігатися в базах даних і т.д.
Ідейними спадкоємцями Java є такі мови, як C++, Eiffel, Smalltalk і Objective C. За винятком примітивних типів даних, практично все в мові є об'єктом.
Основні вимоги до об'єктно-орієнтованої системи:
- інкапсуляція — захована реалізація за абстрактним інтерфейсом;
- поліморфізм — одне і те ж повідомлення, послане різним об'єктам, приводить до виконання різних операцій;
- спадкоємство — нові класи можуть успадковувати дані і функціональність вже існуючих класів;