မျိုးရိုးဆက်ခံမှု့ (Inheritance) အကြောင်းကို လေ့လာရာတွင်၊ မျိုးရိုးဆက်ခံစေသော Super Class နှင့် မျိုးရိုးဆက်ခံသော Sub Class တွေက ဘယ်လိုဖြစ်ပေါ်လာတယ် ဆိုတာကို လေ့လာကြည့်မည် ဆိုလျှင် နားလည်ရလွယ်ကူ လိမ့်မည်။
မျိုးရိုးဆက်ခံမှု့ရဲ့ အဓိက ရည်ရွယ်ချက်သည် Super Class ရဲ့ ပိုင်ဆိုင်မှု့တွေကို၊ အခြားသော Class များမှ တဆင့်ပြန်လိုအသုံးပြု လိုခြင်း ဖြစ်၏။ အောက်ပါ Source Code ကို ကြည့်ပါ။ SuperClass တွင် တန်ဖိုး 10 ရှိတဲ့ price ဆိုတဲ့ အချက်အလက်နှင့် showPrice() ဆိုတဲ့ လုပ်ဆောင်ချက်ကို ပိုင်ဆိုင် ပါတယ်။ SubClass မှာတော့ Constructor သာပိုင်ဆိုင်ပြီး extends SuperClass ဆိုပြီး SuperClass ရဲ့ အမွေဆက်ခံမှု့ကို ရယူနေပါတယ်။ တဖန် Constructor ထဲတွင် price ၏ တန်ဖိုးကို 20 အဖြစ် အစားထိုးနေ၏။
SuperTest Class ထဲမှ main ထဲတွင် SubClass ရဲ့ instance ကို ခေါ်ယူပြီး showPrice() လုပ်ဆောင်ချက်ကို လုပ်ဆောင်စေပါတယ်။ အောက်ပါ Source Code များကို ကွန်ပိုင်းလုပ်ပြီး Run ကြည့်မည်ဆိုပါက The Price is 20 ဟု ကွန်ဆိုးတွင် ဖော်ပြပါလိမ့်မည်။ ဤအချက် တစ်ခုတည်းကိုသာ ကြည့်မည်ဆိုပါက SubClass ထဲမှ SuperClass ၏ အချက်အလက်တွေ၊ လုပ်ဆောင်ချက်တွေကို ဆက်သွယ် အသုံးချနိုင် သလိုမြင်နိုင် ပေလိမ့်မည်။
package test; class SuperClass { int price = 10; void showPrice() { System.out.println("The Price is " + price); } } class SubClass extends SuperClass{ public SubClass() { price = 20; } } public class SuperTest { public static void main(String [] args) throws InstantiationException, IllegalAccessException { SubClass sub = SubClass.class.newInstance(); sub.showPrice(); } }
တကယ်ပဲ SuperClass ရဲ့ ပိုင်ဆိုင်မှု့တွေကို SubClass မှ တိုက်ရိုက် အသုံးပြုနိုင်သလား ဆိုတာကို ပိုသိရအောင် ကျွှန်တော်တို့ Source Code တွေကို နည်းနည်းပြင်ကြည့်ကြည့် ကြရအောင်။
class SuperClass { int price; public SuperClass(int i) { price = i; } void showPrice() { System.out.println("The Price is " + price); } }
အထက်ပါ အတိုင်း SuperClass ကို ပြုပြင်ပြီး Source Code များကို ကွန်ပိုင်းလုပ်ကြည့်မည် ဆိုပါက Compile Error ထွက်ပေါ်မည် ဖြစ်၏။ အဘယ်ကြောင့်ဆိုသော် SubClass ထဲတွင် SuperClass ရဲ့ Constructor ဖြစ်တဲ့ SuperClass(int i) ကို မရေးသားထားသောကြောင့် ဖြစ်သည်။ တနည်းဆိုရသော် Memory ပေါ်တွင် SubClass ကိုခေါ်ယူ အသုံးချရာတွင် နောက်ကွယ်တွင် SuperClass ကိုခေါ်ယူပြီး အသုံးချနေသောကြောင့် ဖြစ်၏။ ကွန်ပိုင်လာမှ SuperClass ရဲ့ Instance ကို ခေါ်ယူဖို့အတွက် Constructor ကို ခေါ်ယူရာတွင် int i ကို ရှာမတွေ့ပါသဖြင့် Error အဖြစ် ဖော်ပြခြင်းဖြစ်ပါသည်။
အထက်ပါ အချက်ကို ကြည့်ခြင်းအားဖြင့် SuperClass ကို ပြောင်းလည်းမည်ဆိုပါက SubClass အပေါ်တွင် တိုက်ရိုက် အကျိုးသက်ရောက်မှု့ များရှိသည်ဆိုသည်ကို သိမြင်နိုင်ပေသည်။ အမွေဆက်ခံမှု့သည် Class တစ်ခုနှင့် တစ်ခုကို ချုပ်နှောင်မှု့တွေကို ဖြစ်ပေါ်စေသည် ဆိုသည့်အချက်သည် သတိထားစရာ အချက်ဖြစ်၏။
အောက်ပါအတိုင်း SubClass ကို ပြုပြင်ရေးသားမည် ဆိုပါက ကွန်ပိုင်း Error ထွက်ပေါ်မည် မဟုတ်တော့ပေ။
class SubClass extends SuperClass{ public SubClass() { super(20); } }
မျိုးရိုးဆက်ခံမှု့ ဆိုတာဘာလဲ ဆိုတာကို ပြန်စဉ်းစားကြည့်ကြရအောင်။ မျိုးရိုးဆက်ခံမှု့ကို အသုံးပြုခြင်းအားဖြင့် သားသမီး instance ကို ခေါ်ယူရာ၌၊ နောက်ကွယ်တွင် မိဘ instance ကို အလိုအလျှောက် ခေါ်ယူပြီး၊ သားသမီး instance မှတဆင့် မိဘ၏ပိုင်ဆိုင်မှု့များကို အမည်ခေါ်စရာမလိုပဲ အသုံးချနိုင်ပေသည်။ သို့ရာတွင် Class တစ်ခုနှင့်တစ်ခု၏ ချုပ်နှောင်မှု့များလည်း ပေါ်ပေါက်စေမည် ဖြစ်၏။
Class တစ်ခု၏ ပိုင်ဆိုင်မှု့များကို ပြန်လည်အသုံးချလိုမှု့ တစ်ခုတည်းမှတွေးမည် ဆိုလျှင် အသုံးပြုလိုသည့် Class ရဲ့ instance ကို ခေါ်ယူ အသုံးပြုမည် ဆိုပါက ရရှိနိုင်၏။ မျိုးရိုးဆက်ခံမှု့ကို အသုံးပြုခြင်း၏ အကျိုးကျေးဇူး ကိုပြပါဆိုပါက မိဘ Class ရဲ့ instance ကို အလိုအလျှောက် ခေါ်ယူနိုင်ခြင်း၊ မိဘ instance ရဲ့ ပိုင်ဆိုင်မှု့တွေကို အမည်တပ်စရာမလိုပဲ အသုံးပြုနိုင်ခြင်း တို့သာရှိမည်ဟု မြင်ပေမည်။
ယခုအထိ ရှင်းပြချက်များကို ကြည့်မည်ဆိုပါက မျိုးရိုးဆက်ခံမှု့ကို အသုံးပြုလောက်တဲ့ အကျိုးသက်ရောက်မှု့ ရှိပါ့မလားဟု မေးစရာရှိပါလိမ့်မည်။ မဟုတ်ပါ။ Java တွင် Override ၊ Polymorphism အစရှိတဲ့ အတွေးအခေါ်များသည် မျိုးရိုးဆက်ခံမှု့ကို အခြေခံထားသော အသုံးပြုချက်များ ဖြစ်ကြ၏။ နောက်အခန်းများတွင် ဆက်လက်ပြီးလေ့လာ သွားပါမည်။
ဤအခန်းတွင် ဖော်ပြလိုသည်မှာ မျိုးရိုးဆက်ခံမှု့ကို Class များ၏ အဖွဲ့အစည်းများကို တည်ဆောက်ရာ၊ Class တစ်ခုနှင့် တစ်ခု၏ ပတ်သက်မှု့တို့ကို သတ်မှတ်ရာ တွင် အသုံးပြုစေလိုပါသည်။ သို့မဟုတ်ပဲ Class တစ်ခု၏ ပိုင်ဆိုင်မှု့ ကို ပြန်လည်အသုံးပြုလိုမှု့ တစ်ခုတည်းကြောင့် ပတ်သက်မှု့မရှိသော Class တစ်ခုမှ မျိုးရိုးဆက်ခံမှု့ကို အသုံးပြုမည်ဆိုပါက မလိုအပ်သော ချုပ်နှောင်မှု့များကို ဖြစ်ပေါ်စေပါသဖြင့် အထူးသတိထား စေလိုပါသည်။
အကိုေရ throws InstantiationException, IllegalAccessException ဘာလို႔ထည့္ရတာလဲဟင္
ReplyDeleteခုမွစေလ့လာတာမို႔ပါ