Програмиране на Java - пакети и интерфейси
Пакетът (package) е вид контейнер, който се използва за изолиране на имена на класове. Например, можете да създадете клас List, да го опаковате в пакет и след това да не мислите за възможни конфликти, които могат да възникнат, ако някой друг създаде клас с име List.
Интерфейс-е изрична спецификация на набор от методи, които трябва да присъстват в клас, който прилага тази спецификация. Няма имплементация на тези методи в интерфейса. Подобно на абстрактните класове, интерфейсите имат прекрасното допълнително свойство, че могат да бъдат наследявани многократно. Конкретен клас може да наследи само един суперклас, но може да реализира неограничен брой интерфейси.
Всички идентификатори, които използвахме в нашите примери досега, бяха в едно и също пространство от имена. Това означава, че трябваше да се уверим, че всеки клас има собствено уникално име, за да избегнем конфликтни ситуации. Пакетите са механизъм, който служи както за работа с пространства от имена, така и за ограничаване на видимостта. Всеки .java файл има 4 идентични вътрешни части, от които сме използвали само една в нашите примери досега. Следва общата форма на изходния файл на Java.
изявление за единичен пакет (по избор)
произволен брой инструкции за импортиране (по избор)
произволен брой частни класове в пакета (по избор)
Първото нещо, което може да се появи в изходния файл на Java, е оператор за пакет, който казва на преводача в кой пакет трябва да бъдат дефинирани класовете, съдържащи се във файла. Пакетите определят набор от отделнипространства от имена, които съхраняват имена на класове. Ако операторът на пакета не е указан, класовете попадат в неназованото пространство по подразбиране. Ако декларирате клас като принадлежащ към определен пакет, например,
тогава изходният код на този клас също трябва да се съхранява в директорията java/awt/image.
Директорията, която преводачът на Java ще третира като корен на йерархията на пакета, може да бъде зададена с помощта на променливата на средата CLASSPATH. С тази променлива можете да зададете множество главни директории за йерархията на пакета (чрез ; както в нормален PATH).
Превод на класове в пакети
Когато се опитате да поставите клас в пакет, веднага ще се сблъскате със строгото изискване йерархията на директорията да съвпада точно с йерархията на пакета. Не можете да преименувате пакет, без да преименувате директорията, където се съхраняват неговите класове. Тази трудност се вижда веднага, но има и по-малко очевиден проблем.
Представете си, че сте написали клас с име PackTest в пакетния тест. Създавате тестова директория, поставяте файла PackTest.Java в тази директория и превеждате. Дотук - всичко е наред. Въпреки това, когато се опитате да го стартирате, получавате съобщението "не мога да намеря клас PackTest" от интерпретатора ("Не мога да намеря класа PackTest"). Вашият нов клас вече се съхранява в пакет с име test, така че сега трябва да посочите цялата йерархия на пакетите, разделяйки имената им с точки - test.PackTest. Освен това трябва или да отидете едно ниво нагоре в йерархията на директориите и да въведете отново "java test.PackTest", или да зададете променливата CLASSPATH на директорията, която е на върха на йерархията на класовете, която разработвате.
След оператора за пакет, но преди дефиниция на клас в изходния файл на Java, може да има списък с оператори за импортиране. Опаковките са добримеханизъм за разделяне на класове един от друг, така че всички вградени класове на Java се съхраняват в пакети. Общата форма на командатаimportе:
импортиране на пакет1 [.package2].(име на клас*);
Но не се препоръчва да се използват формуляри в записа на извлечението за импортиране, като се използва звездичка без необходимост, т.к това може значително да увеличи времето за превод на кода (това не се отразява на скоростта на работа и размера на програмата).
Всички вградени Java класове, които идват с дистрибуцията, се съхраняват в пакет, наречен java. Основните функции на езика се съхраняват във вложения пакет java.lang. Целият този пакет се импортира автоматично от преводача във всички програми. Това е еквивалентно на поставянето на оператора в началото на всяка програма
Ако два пакета, които са включени с помощта на формата със звездичка на оператора за импортиране, имат класове с едно и също име, но вие не ги използвате, преводачът няма да отговори. Но ако се опитате да използвате такъв клас, веднага ще получите съобщение за грешка и ще трябва да пренапишете инструкциите за импортиране, за да посочите изрично кой клас пакет се отнасяте.
клас MyDate разширява Java.util.Date
• Подкласове в същия пакет.
• Без подкласове в един и същи пакет.
• Подкласове в различни пакети.
• Класове, които не са подкласове и не са част от същия пакет.
Езикът Java има три нива на достъп, дефинирани от ключови думи: private (private), публичен (open) и protected (protected), които се използват в различни комбинации. Съдържанието на клетките на таблицата определя наличието на променлива с дадена комбинация от модификатори (колона) от посоченото място (ред).
подклас в същия пакет
независим клас в същия пакет
подклас в друг пакет
независим клас в друг пакет
На пръв поглед всичко това може да изглежда прекалено сложно, но има няколко правила, които ще ви помогнат да го разберете. Елемент, обявен за публичен, е достъпен отвсякъде. Всичко, обявено за частно, е достъпно само в рамките на класа и никъде другаде. Ако даден елемент изобщо няма зададен модификатор на ниво на достъп, тогава такъв елемент ще бъде видим от подкласове и класове на същия пакет. Това е нивото на достъп по подразбиране, използвано от езика Java. Ако искате елементът да бъде достъпен извън пакета, но само за подкласове на класа, към който принадлежи, трябва да декларирате елемента като защитен. И накрая, ако искате елементът да бъде достъпен само за подкласове и независимо дали са в този пакет или не, използвайте частната защитена комбинация.
защита на публичен клас
private int n_pri = 2;
защитен int n_pro = 3;
private protected int n_pripro = 4;