![]()
В езика Java (както в останалите обекно-ориентирани езици за програмиране) класовете могат да се наследяват от други класове. Така веднъж създадени, класовете могат да се използват като база за дефиниране на нови класове, които слабо се отличават от първите. Новите класове, наследяват елементите на съществуващите и могат да променят поведението им с дефиниране на методи със същите имена.
Работа с повече от един клас
Реалните програми използват повече от един клас за решаване на определена задача. Възможни са два подхода за вмъкване на класове – всеки клас да бъде в нов файл или няколко класа да са в един файл. Двата подхода имат следните различия:
- Няколко класа в един файл:
В този случай само един от класовете може да има име, съвпадащо с името на файла. Именно този клас ще бъде видим от другите файлове и се нарича основен, а останалите класове са помощни. За да са видими, те трябва да бъдат декларирани със служебната дума public.
Пр. 1
// начало на Example.java
class Example {
int a;
void main (String[] arg) {
Extra e = new Extra();
…
}
}
class Extra {
int x;
…
}
// край на Example.java
Въпреки че класът Extra е дефиниран след основния клас Example, той може да бъде използван в него.
- Класове в различни файлове:
Възможно е всеки клас от една програма да се разполага в отделен файл с име, съвпадащо с името на класа. Така класовете по подразбиране са видими.
Наследяване на класовете
Един Java клас може да се обяви като наследник на някакъв друг клас. Това става чрез служебната дума extends.
Пр. 2
class Base {
… //определяне на данни и методи
}
class New extends Base {
… //определяне на данни и методи
}
В новия клас New се съдържат всички данни и методи, определени в класа Base и още някои собствени декларации. Така новият клас се явява разширение на класа Base. Предимството на пораждане на класове един от друг е очевидно – възможност за многократно използване на вече въведена програма.
Пр. 3
class Door { // описание на обикновена врата
boolean stateOpen;
void open() {stateOpen = true; }
void close() {StateOpen = false;}
}
class LockingDoor extends Door {// описание на врата, която
//се заключва с ключ. Автоматично се наследяват (включват)
// stateOpen, open() и close()
boolean stateLocked;
void lock() { stateLocked = true;}
void unlock() { stateLocked = false;}
class SecretDoor extends Door { //описание на врата, която се
//заключва с код. Автоматично се наследяват (включват)
//stateOpen, open и close
…
}
class LockingAlarmedDoor extends LockingDoor {//описание на
//врата …Автоматично се наследяват (включват)
// stateOpen, open, close, stateLocked, lock, и unlock
…
}
|
Наследяването от примера е онагледенo на следната диаграма:
Суперклас и подклас
Когато се дефинира наследяване един клас се явява наследник на друг. Както казахме, в този случай първият включва в себе си всички елементи на втория. Вторият се нарича суперклас или базов, а първият – подклас или извлечен. Наследяването се задава при декларация на подкласа със служебната дума extends.
Пр. 3
class Base {
//елементи на базовия клас (суперклас)
}
class New extends Base {
//елементи на извлечения клас (подклас)
}
При наследяването се добавят нови членове данни и/или методи, като се запазват и всички данни и методи на суперкласа. Методите и данните на суперкласа се наследяват в подкласа.
Елементите на суперкласа се използват в подкласа директно със задаване на тяхното име. Когато има елементи на класа и подкласа с едно и също име, за достъп до елементите на класа се използва служебната дума super.
Пр. 4
class Base {
int x, y;
}
class New extends Base {
int z, y;
void example() {
x = 1; // х от суперклас Base
y = 1; // у отизвлечен клас New
super.y = 1; // достъп до елемент у на суперклас
//Base
z = 1; // от извлечен клас New
}
}
Достъп
Пред членовете данни и подпрограмите на класа може да се използва модификатор за достъп. Съответно:
- Скрит достъп: private. С този модификатор един елемент се обявява за скрит за всички методи, които са извън класа, в който е елемента;
Пр. 5
class Alfa {
private int privateDatum;
private void privateMethod() {
System.out.println(“Method from Alfa”);
…
}
class Beta {
void example() {
Alfa e = new alfa();
e.privateDatum = 1; // невъзможно!
e.privateMеthod(); // невъзможно!
…
}
}
- Видим достъп: public. С този модификатор елемента се обявява за видим и достъпен от всички външни програми. Видимите променливи могат да бъдат четени и да се променя тяхната стойност. Поради тази причина много рядко променливите имат такъв модификатор.
Пр. 6
class Alfa {
private int privateDatum;
private void privateMethod() {
System.out.println(“Method from Alfa”);
public int publicDatum;
public void publicMethod() {
System.out.println(“Method from Alfa”);
…
}
class LetterA {
void example() {
Alfa e = new Аlfa();
e.privateDatum = 1; // невъзможно!
e.privateMеthod(); // невъзможно!
e. publicDatum = 2; // възможно
e. publicMethod(); // възможно
…
}
}
- Защитен достъп: protected. Това е комбинация между скрития и видимия достъп. Всеки елемент, който е защитен, е видим в собствения си клас и във всички негови преки или косвени подкласове, а е скрит за всички останали части на програмата.
Пр. 7
class Alfa {
private int privateDatum;
private void privateMethod() {
System.out.println(“Method from Alfa”);
protected int protectedDatum;
protected void protectedMethod() {
System.out.println(“Method from Alfa”);
…
}
class LetterA extends Alfa {
void example() {
Alfa e = new Аlfa();
e.privateDatum = 1; // невъзможно!
e.privateMеthod(); // невъзможно!
e.protectedDatum = 2; // възможно
e.protectedMethod(); // възможно
…
}
}
Popularity: 1% [?]
No related posts.
Related posts brought to you by Yet Another Related Posts Plugin.
RSS Feed
Twitter

януари 26th, 2010
admin
Posted in 
