.
1. Utangulizi
Java ni lugha ya programu inayotumika sana katika nyanja mbalimbali, kutoka mifumo ya biashara hadi programu za wavuti na maendeleo ya Android. Kati ya sifa zake nyingi, “urithi” ni mojawapo ya dhana muhimu zaidi wakati wa kujifunza programu inayolenga vitu (object‑oriented programming).
Kwa kutumia urithi, darasa jipya (darasa la chini/mtoto) linaweza kurithi utendaji wa darasa lililopo (darasa la juu/mzazi). Hii husaidia kupunguza kunakiliwa kwa msimbo na kufanya programu iwe rahisi kupanuliwa na kudumishwa. Katika Java, urithi unatekelezwa kwa kutumia neno kuu extends.
Katika makala hii, tunaelezea wazi jukumu la neno kuu extends katika Java, matumizi yake ya msingi, matumizi ya vitendo, na maswali ya kawaida. Mwongozo huu ni muhimu si tu kwa wanaoanza kujifunza Java, bali pia kwa wale wanaotaka kukagua urithi. Mwishowe, utaelewa kikamilifu faida na hasara za urithi pamoja na mambo muhimu ya ubunifu.
Hebu tuanze kwa kuangalia kwa karibu “Urithi ni nini katika Java?”
2. Urithi wa Java ni Nini?
Urithi wa Java ni mekanizma ambapo darasa moja (darasa la juu/mzazi) linapitia tabia na utendaji wake kwa darasa lingine (darasa la chini/mtoto). Kwa urithi, sehemu (variables) na mbinu (functions) zilizofafanuliwa katika darasa la mzazi zinaweza kutumika tena katika darasa la mtoto.
Mekanismo huu hufanya iwe rahisi kupanga na kusimamia msimbo, kuunganisha michakato iliyoshirikiwa, na kupanua au kubadilisha utendaji kwa urahisi. Urithi ni moja ya nguzo tatu kuu za Programu Inayolenga Vitu (OOP), pamoja na usimbaji (encapsulation) na polimorfizimu.
Kuhusu Uhusiano wa “is-a”
Mfano wa kawaida wa urithi ni “uhusiano wa is-a”. Kwa mfano, “Mbwa ni Mnyama”. Hii inamaanisha kwamba darasa Dog linakurithi kutoka darasa Animal. Mbwa anaweza kuchukua tabia na tabia za Mnyama huku akiongeza sifa zake za kipekee.
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
Katika mfano huu, darasa Dog linakurithi kutoka darasa Animal. Kitu cha Dog kinaweza kutumia mbinu ya bark pamoja na mbinu iliyokurithi eat.
Nini Kinatokea Unapotumia Urithi?
- Unaweza kuunganisha mantiki na data iliyoshirikiwa katika darasa la mzazi, kupunguza haja ya kuandika msimbo ule ule mara kwa mara katika kila darasa la chini.
- Kila darasa la chini linaweza kuongeza tabia yake ya kipekee au kubatilisha (override) mbinu za darasa la mzazi.
Kutumia urithi husaidia kupanga muundo wa programu na kufanya kuongeza vipengele na matengenezo kuwa rahisi. Hata hivyo, urithi si kila wakati chaguo bora, na ni muhimu kutathmini kwa umakini ikiwa uhusiano wa “is-a” wa kweli upo wakati wa ubunifu.
3. Jinsi Neno kuu extends Linavyofanya Kazi
Neno kuu extends katika Java linatangaza wazi urithi wa darasa. Wakati darasa la mtoto linakurithi utendaji wa darasa la mzazi, sarufi extends ParentClassName hutumika katika tamko la darasa. Hii inaruhusu darasa la mtoto kutumia moja kwa moja washiriki wote wa umma (sehemu na mbinu) wa darasa la mzazi.
Sarufi ya Msingi
class ParentClass {
// Fields and methods of the parent class
}
class ChildClass extends ParentClass {
// Fields and methods unique to the child class
}
Kwa mfano, tukitumia darasa Animal na Dog zilizotajwa awali, tunapata:
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
Kwa kuandika Dog extends Animal, darasa Dog linakurithi kutoka darasa Animal na linaweza kutumia mbinu ya eat.
Kutumia Washiriki wa Darasa la Mzazi
Kwa urithi, kitu cha darasa la mtoto kinaweza kufikia mbinu na sehemu za darasa la mzazi (mradi vigezo vya ufikiaji vinavyoruhusu):
Dog dog = new Dog();
dog.eat(); // Calls the parent class method
dog.bark(); // Calls the child class method
Maelezo Muhimu
- Java inaruhusu urithi kutoka kwa darasa moja tu (urithi wa moja). Huwezi kutaja madarasa mengi baada ya
extends. - Ikiwa unataka kuzuia urithi, unaweza kutumia
finalmodifier kwenye darasa.
Vidokezo vya Maendeleo ya Vitendo
Kutumia extends vizuri kunakuruhusu kuweka utendaji wa kawaida katikati ya darasa la mzazi na kupanua au kubadilisha tabia katika madarasa ya kina. Pia ni muhimu wakati unataka kuongeza vipengele vipya bila kubadilisha code iliyopo.
4. Kubainisha Njia tena na Neno la super
Wakati wa kutumia urithi, kuna hali ambapo unataka kubadilisha tabia ya njia iliyofafanuliwa katika darasa la mzazi. Hii inaitwa “kubainisha njia tena.” Katika Java, kubainisha tena hufanywa kwa kufafanua njia katika darasa la mtoto yenye jina sawa na orodha ya vigezo sawa kama njia katika darasa la mzazi.
Kubainisha Njia tena
Wakati wa kubainisha njia tena, ni kawaida kuongeza annotation ya @Override. Hii inamsaidia compiler kugundua makosa ya bahati mbaya kama majina ya njia yasiyofaa au signatures.
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("ドッグフードを食べる");
}
}
Katika mfano huu, darasa la Dog linabainisha tena njia ya eat. Wakati wa kuita eat kwenye mfano wa Dog, matokeo yatakuwa “ドッグフードを食べる”.
Dog dog = new Dog();
dog.eat(); // Displays: ドッグフードを食べる
Kutumia Neno la super
Ikiwa unataka kuita njia ya asili ya darasa la mzazi ndani ya njia iliyobainishwa tena, tumia neno la super.
class Dog extends Animal {
@Override
void eat() {
super.eat(); // Calls the parent class’s eat()
System.out.println("ドッグフードも食べる");
}
}
Hii inatekeleza njia ya eat ya darasa la mzazi kwanza na kisha inaongeza tabia ya darasa la kina.
Wabuni na super
Ikiwa darasa la mzazi lina fundi wa wabuni wenye vigezo, darasa la mtoto lazima liite wazi kwa kutumia super(vigezo) kama mstari wa kwanza wa fundi wake wa wabuni.
class Animal {
Animal(String name) {
System.out.println("Animal: " + name);
}
}
class Dog extends Animal {
Dog(String name) {
super(name);
System.out.println("Dog: " + name);
}
}
Muhtasari
- Kubainisha tena kunamaanisha kufafanua tena njia ya darasa la mzazi katika darasa la mtoto.
- Kutumia annotation ya
@Overridelinapendekezwa. - Tumia
superwakati unataka kutumia tena utekelezaji wa njia ya darasa la mzazi. superpia hutumiwa wakati wa kuita wabuni wa mzazi.
5. Faida na Hasara za Urithi
Kutumia urithi katika Java huleta faida nyingi katika muundo na maendeleo ya programu. Hata hivyo, matumizi yasiyofaa yanaweza kusababisha matatizo makubwa. Chini, tunaeleza faida na hasara kwa undani.
Faida za Urithi
- Kuboreshwa kwa kutumia code tena Kufafanua mantiki na data inayoshirikiwa katika darasa la mzazi kunaondoa hitaji la kurudia code sawa katika kila darasa la kina. Hii hupunguza kurudia na kuboresha uwezo wa kudumisha na kusomwa.
- Upanuzi rahisi zaidi Wakati utendaji mpya unahitajika, unaweza kuunda darasa jipya la kina kulingana na darasa la mzazi bila kubadilisha code iliyopo. Hii hupunguza athari za mabadiliko na hupunguza nafasi ya makosa.
- Inaiwezesha polymorphism Urithi unaruhusu “nambari ya darasa la mzazi kurejelea mfano wa darasa la mtoto.” Hii inaiwezesha muundo rahisi kwa kutumia interfaces za kawaida na tabia ya polymorphic.
Hasara za Urithi
.
Mifumo mirefu ya urithi hufanya muundo kuwa mgumu
Ikiwa minyororo ya urithi inakua sana, inakuwa vigumu kuelewa wapi tabia imefafanuliwa, na kufanya matengenezo kuwa magumu.Mabadiliko katika darasa mzazi huathiri madarasa yote ya chini
Kubadilisha tabia ya darasa mzazi kunaweza kusababisha matatizo bila ya kutaka katika madarasa yote ya chini. Madarasa ya mzazi yanahitaji muundo wa tahadhari na masasisho.Inaweza kupunguza ubadilifu wa muundo
Kutumia urithi kupita kiasi kunafanya darasa liwe na uhusiano mkali, na kufanya mabadiliko ya baadaye kuwa magumu. Katika baadhi ya hali, uhusiano wa “ina” (has-a) kwa kutumia muundo (composition) ni rahisi zaidi kuliko urithi wa “ni” (is-a).
Muhtasari
Urithi ni wenye nguvu, lakini kutegemea juu yake kwa kila kitu kunaweza kusababisha matatizo ya muda mrefu. Daima thibitisha ikiwa kuna uhusiano halisi wa “ni” (is-a relationship) na tumia urithi tu pale inapofaa.
6. Tofauti Kati ya Urithi na Interfaces
Java inatoa mifumo miwili muhimu ya kupanua na kupanga utendaji: urithi wa darasa (extends) na interfaces (implements). Zote mbili zinaunga mkono matumizi tena ya msimbo na muundo unaobadilika, lakini muundo na matumizi yaliyokusudiwa yanatofautiana sana. Hapa chini, tunaelezea tofauti na jinsi ya kuchagua kati yao.
Tofauti Kati ya extends na implements
- extends (Urithi)
- Unaweza kurithi kutoka darasa moja tu (urithi mmoja).
- Sehemu (fields) na mbinu zilizotekelezwa kikamilifu kutoka darasa mzazi zinaweza kutumika moja kwa moja katika darasa la chini.
Inawakilisha uhusiano wa “ni” (is-a relationship) (mfano, Mbwa ni Mnyama).
implements (Utekelezaji wa Interface)
- Interfaces nyingi zinaweza kutekelezwa kwa wakati mmoja.
- Interfaces zina tamko la mbinu pekee (ingawa mbinu za chaguo-msingi zipo tangu Java 8).
- Inawakilisha uhusiano wa “inaweza kufanya” (can-do relationship) (mfano, Mbwa anaweza kulia, Mbwa anaweza kutembea).
Mfano wa Kutumia Interfaces
interface Walkable {
void walk();
}
interface Barkable {
void bark();
}
class Dog implements Walkable, Barkable {
public void walk() {
System.out.println("歩く");
}
public void bark() {
System.out.println("ワンワン");
}
}
Katika mfano huu, darasa Dog linatekeleza interfaces mbili, Walkable na Barkable, likitoa tabia inayofanana na urithi wa mara nyingi.

Kwa Nini Interfaces Zinahitajika
Java inakata urithi wa darasa nyingi kwa sababu unaweza kusababisha migogoro wakati madarasa ya mzazi yanatambua mbinu au sehemu sawa. Interfaces hutatua tatizo hili kwa kuruhusu darasa kupokea aina nyingi bila kurithi utekelezaji unaokinzana.
Jinsi ya Kuzitumia Kwa Usahihi
- Tumia
extendspale ambapo kuna uhusiano wa “ni” (is-a) ulio wazi kati ya madarasa. - Tumia
implementsunapohitaji kutoa mkataba wa tabia ya pamoja kwa madarasa mengi.
Mifano:
- “Mbwa ni Mnyama” →
Dog extends Animal - “Mbwa anaweza kutembea na anaweza kulia” →
Dog implements Walkable, Barkable
Muhtasari
- Darasa linaweza kurithi kutoka darasa mzazi mmoja tu, lakini linaweza kutekeleza interfaces nyingi.
- Kuchagua kati ya urithi na interfaces kulingana na nia ya muundo husababisha msimbo safi, unaobadilika, na unaodumu.
7. Mazoea Mazuri ya Kutumia Urithi
Urithi katika Java ni wenye nguvu, lakini matumizi yasiyofaa yanaweza kufanya programu kuwa imara sana na vigumu kudumisha. Hapa chini ni mazoea bora na miongozo ya kutumia urithi kwa usalama na ufanisi.
Wakati wa Kutumia Urithi — na Wakati wa Kuepuka
- Tumia urithi wakati:
- Kuna uhusiano wa “ni” ulio wazi (mfano, Mbwa ni Mnyama).
- Unataka kutumia tena utendaji wa darasa mzazi na kuupanua.
Unataka kuondoa msimbo unaojirudia na kuunganisha mantiki ya pamoja.
Epuka urithi wakati:
- Unautumia tu kwa ajili ya kutumia tena msimbo (hii mara nyingi husababisha muundo usio wa asili wa darasa).
- Uhusiano wa “ina” (has-a) ni sahihi zaidi — katika hali hizo, fikiria muundo (composition).
Kuchagua Kati ya Urithi na Muundo (Composition)
. Urithi (extends): uhusiano wa “ni-a” * Mfano: Dog extends Animal * Inafaa wakati subclass inawakilisha kweli aina ya superclass.
* Uundaji (uhusiano wa “ina-a”)*
* Mfano: Gari lina Injini
* Inatumia mfano wa darasa lingine ndani ili kuongeza utendaji.
* Ni rahisi kubadilika na rahisi kuendana na mabadiliko ya baadaye.
Miongozo ya Ubunifu Ili Kuepuka Matumizi Mabovu ya Urithi
- Usijenge hierarkia za urithi zikiwa nene sana (hifadhi viwango 3 au chini).
- Kama darasa nyingi zinarithi kutoka kwa mzazi mmoja, fanyia upya tathmini kama majukumu ya mzazi yanakubalika.
- Daima zingatia hatari ya mabadiliko katika darasa la mzazi kuathiri darasa zote za watoto.
- Kabla ya kutumia urithi, fikiria mbadala kama vile interfaces na uundaji.
Kudhibiti Urithi kwa Modifia final
- Kuongeza
finalkwa darasa kunazuia urithi wake. - Kuongeza
finalkwa njia kunazuia kubadilishwa na darasa la watoto.final class Utility { // This class cannot be inherited } class Base { final void show() { System.out.println("オーバーライド禁止"); } }
Kuboresha Nyaraka na Maoni
- Kurekodi uhusiano wa urithi na nia za muundo wa darasa katika Javadoc au maoni humfanya matengenezo ya baadaye kuwa rahisi sana.
Muhtasari
Urithi ni rahisi kutumia, lakini lazima utumike kwa makusudi. Daima uliza, “Je, darasa hili kweli ni aina ya darasa la mzazi?” Ikiwa huna uhakika, fikiria uundaji au interfaces kama mbadala.
8. Muhtasari
Hadi hatua hii, tumeelezea urithi wa Java na neno extends kwa undani—kutoka misingi hadi matumizi ya vitendo. Hapa chini ni muhtasari wa pointi kuu zilizojadiliwa katika makala hii.
- Urithi wa Java unaruhusu subclass kuchukua data na utendaji wa superclass, na kuwezesha muundo wa programu wenye ufanisi na unaoweza kutumika tena.
- Neno
extendslinaelezea uhusiano kati ya mzazi na mtoto (uhusiano wa “ni-a”). - Ubadilishaji wa njia na neno
superhumuwezesha kupanua au kubinafsisha tabia iliyorithiwa. - Urithi una faida nyingi, kama vile matumizi tena ya msimbo, upanuzi, na usaidizi wa polymorphism, lakini pia una hasara kama hierarkia nene au ngumu na mabadiliko yenye athari pana.
- Kuelewa tofauti kati ya urithi, interfaces, na uundaji ni muhimu kwa kuchagua mbinu sahihi ya muundo.
- Epuka kutumia urithi kupita kiasi; daima uwe wazi kuhusu nia ya muundo na sababu zake.
Urithi ni mojawapo ya dhana kuu za programu inayolenga vitu (object‑oriented) katika Java. Kwa kuelewa sheria na mazoea mazuri, utaweza kuutumia kwa ufanisi katika maendeleo ya ulimwengu halisi.
9. Maswali Yanayoulizwa Mara Kwa Mara (FAQ)
Q1: Nini hutokea kwa constructor ya darasa la mzazi wakati darasa linazorithiwa katika Java?
A1: Kama darasa la mzazi lina constructor isiyo na hoja (default), inaitwa kiotomatiki kutoka kwa constructor ya darasa la mtoto. Ikiwa darasa la mzazi lina tu constructor yenye vigezo, darasa la mtoto lazima litaje wazi kwa kutumia super(arguments) mwanzoni mwa constructor yake.
Q2: Je, Java inaweza kufanya urithi wa darasa nyingi?
A2: Hapana. Java hait supporti urithi wa darasa nyingi. Darasa linaweza kurithi darasa moja tu kwa kutumia extends. Hata hivyo, darasa linaweza kutekeleza interfaces nyingi kwa kutumia implements.
Q3: Tofauti kati ya urithi na uundaji ni nini?
A3: Urithi unawakilisha uhusiano wa “ni-a”, ambapo darasa la mtoto linatumia tena utendaji na data ya darasa la mzazi. Uundaji unawakilisha uhusiano wa “ina-a”, ambapo darasa lina mfano wa darasa lingine. Uundaji mara nyingi unatoa ubunifu zaidi na unapendekezwa katika hali nyingi zinazohitaji usambazaji dhaifu au upanuzi wa baadaye.
Q4: Je, kigeuza cha final kinazuia urithi na kufunika?
A4: Ndiyo. Ikiwa darasa limewekwa alama ya final, haliwezi kurithiwa. Ikiwa njia imewekwa alama ya final, haiwezi kufunikwa katika darasa la kina. Hii ni muhimu kwa kuhakikisha tabia thabiti au kwa madhumuni ya usalama.
Q5: Nini kinatokea ikiwa darasa la mzazi na la mtoto wanalenga nyanja au njia zenye jina sawa?
A5: Ikiwa nyanja yenye jina sawa imefafanuliwa katika madarasa yote mawili, nyanja katika darasa la mtoto inaficha ile ya mzazi (kufunika kivuli). Njia zinafanya tofauti: ikiwa sahihi zinafanana, njia ya mtoto inafunika njia ya mzazi. Kumbuka kuwa nyanja haziwezi kufunikwa—zinafichwa tu.
Q6: Nini kinatokea ikiwa kina cha urithi kinakuwa kikubwa sana?
A6: Hierarkia za urithi zenye kina hufanya msimbo kuwa mgumu kuelewa na kudumisha. Inakuwa vigumu kufuatilia mahali ambapo mantiki imefafanuliwa. Kwa muundo unaoweza kudumishwa, jaribu kuweka kina cha urithi kifupi na majukumu kutenganishwa wazi.
Q7: Ni tofauti gani kati ya kufunika na kufungua?
A7: Kufunika hufafanua upya njia kutoka darasa la mzazi katika darasa la mtoto. Kufungua hufafanua njia nyingi katika darasa moja lenye jina sawa lakini aina au idadi tofauti za vigeuza.
Q8: Je, darasa la kufikirika na vivinjari vinapaswa kutumika tofauti vipi?
A8: Darasa la kufikirika hutumika unapotaka kutoa utekelezaji ulioshirikiwa au nyanja kati ya madarasa yanayohusiana. Vivinjari hutumika unapotaka kufafanua mikataba ya tabia ambayo madarasa mengi yanaweza kutekeleza. Tumia darasa la kufikirika kwa msimbo ulioshirikiwa na vivinjari wakati wa kuwakilisha aina nyingi au wakati “uwezo” mbalimbali unahitajika.

