[သင္ခန္းစာ ၁၆] ခြင့္ျပဳခ်က္မရိွဘဲ member မ်ားကိုအသံုးျပဳခြင့္၊ ေျပာင္းလဲခြင့္မရႏိုင္ပါ။

[သင္ခန္းစာ ၁၆] ခြင့္ျပဳခ်က္မရိွဘဲ member မ်ားကိုအသံုးျပဳခြင့္၊ ေျပာင္းလဲခြင့္မရႏိုင္ပါ။

 

အခု အေရးႀကီးတဲ့ “access limit to a member” အေၾကာင္းကိုရွင္းျပပါမယ္။ member ဆိုတာက class ထဲမွာရိွတဲ့ field(attribute) တုိ႔၊ method တို႔ကုိ ၿခံဳၿပီးေျပာတာျဖစ္ပါတယ္။

သင္ခန္းစာ ၉ နဲ႔ ၁၀ ကို နားလည္သေဘာေပါက္မယ္ထင္ပါတယ္။

member ေတြကို field (attribute) တုိ႔ method အေနနဲ႔ ေခၚပါတယ္။

အခု “field (attribute)” ေတြအေၾကာင္းရွင္းျပခ်င္ပါတယ္။

စကားလံုးေတြကို ျမင္ရရင္ နည္းနည္းခက္တဲ့ပံုေပၚတယ္။ ဥပမာ "class", "member", "access restriction", "field", ... စတာေတြေပါ့။ ဒါေပမယ့္ သူတုိ႔ေတြက program တစ္ပုဒ္ကိုေရးဖို႔အတြက္ နားလည္ဖို႔လိုတဲ့ words ေတြမို႔ ေလ့လာၾကည့္ရေအာင္။

Field ေတြကုိ အသံုးျပဳရာမွာ အသံုးျပဳပံုအရ အကန္႔အသတ္ရိွပါတယ္။

ပထမအေနနဲ႔ သင္ခန္းစာ၁၀က ပရိုဂရမ္ကိုသံုးၿပီး input and execute လုပ္ၾကည့္ရေအာင္။

public class AnotherClassSample

{

    private String name;                                         // (A)

     // constructer

    public AnotherClassSample()                                  // (B)

    {

        System.out.println("AnotherClassSample Constructor!! ");  // (C)

        name = "foo";                                            // (D)

    }

     // name setting

    public void setName(String newName)

    {

        name = newName;                                         // (E)

    }

    // name indication

    public void printName()

    {

        System.out.println("My name is " + name + ".");          // (F)

    }

}

public class ClassSample

{

    private String msg;                                  // (1)

    public ClassSample()

    {

        System.out.println("Constructor Was Called.");   // (2)

    }

    public void setMessage(String inMsg)

    {

        msg = inMsg;                                     // (3)

    }

    public void printMessage()

    {

        System.out.println("message:" + msg);            // (4)

    }

    public static void main(String[] args)

    {

        ClassSample classSample;                         // (5)

        classSample = new ClassSample();                 // (6)

        classSample.setMessage("Hello Java World! ");     // (7)

        classSample.printMessage();                      // (8)

        AnotherClassSample anotherClass = new AnotherClassSample(); // (9)

        anotherClass.printName();                        // (10)

        anotherClass.setName("bar");                     // (11)

        anotherClass.printName();                        // (12)

    }

}

ပရိုဂရမ္ကို compilation and execution အေျဖကေတာ့ ေအာက္ကအတိုင္းျပမွာျဖစ္ပါတယ္။

lesson16a

အခု တန္ဖိုးေတြ assign ထည့္တာကို ၾကည့္ရေအာင္။

အဲဒီ AnotherClassSample class ရဲ႕(E)မွာတန္ဖိုးထည့္တာကိုၾကည့္ရေအာင္။

private String အေနနဲ႔ေၾကညာထားတဲ့ name ဆိုတဲ့ variable ထဲကို တန္ဖိုးတစ္ခုကိုထည့္လိုက္တယ္။

အဓိပၸာယ္ကေတာ့ name ဆိုတာက AnotherClassSample ရဲ႕ ကိုယ္ပိုင္ field တစ္ခုျဖစ္တယ္လို႔ ေၾကညာလုိက္တာျဖစ္ပါတယ္။

အခု method ထဲမွာ variables ေၾကညာတာကိုေလ့လာရေအာင္။ Field ဆိုတာလည္း variables အမ်ိဳးအစားတစ္ခုျဖစ္ပါတယ္။ ျခားနားခ်က္ကေတာ့ method ထဲမွာေၾကညာထားတဲ့ Variables ကို method ထဲမွာပဲအသံုးျပဳႏိုင္ပါတယ္။ တစ္ကယ္လို႔ variable ကို class ရဲ႕ field အေနနဲ႔ ေၾကညာတယ္ဆိုရင္ သူ႔ကို သတ္မွတ္ခ်က္အေပၚမူတည္ၿပီးေတာ့ class ရဲ႕အတြင္းမွာပဲျဖစ္ျဖစ္ အျပင္မွာပဲျဖစ္ျဖစ္ အသံုးျပဳႏိုင္ပါတယ္။

lesson16b

private” ရဲ႕ အဓိပၸာယ္က ဘာလဲ?

private” ရဲ႕ အဓိပၸာယ္ကေတာ့ သူ႕ကိုေၾကညာထားတဲ့ class အတြင္းကပဲအသံုးျပဳႏိုင္ပါတယ္။ စမ္းၾကည့္လိုက္ရေအာင္။

အဲဒါေၾကာင့္ အျခား class တစ္ခုျဖစ္တဲ့ ClassSample က AnotherClassSample ရဲ႕ fieldေတြကို တိုက္ရိုက္ အသံုးမျပဳႏို္င္ပါဘူး။ ဒါေပမယ့္ AnotherClassSample class ရဲ႕ setName method ကိုသံုးၿပီး တန္ဖိုးကို ထည့္ႏိုင္ပါတယ္။

ကဲ AnotherClassSample class ရဲ႕ field ေတြကို တန္ဖိုးေတြတိုက္ရိုက္ထည့္ၾကည့္ရေအာင္။

public static void main(String[] args)

{

    ClassSample classSample;                         // (5)

    classSample = new ClassSample();                 // (6)

    classSample.setMessage("Hello Java World!");     // (7)

    classSample.printMessage();                      // (8)

    AnotherClassSample anotherClass = new AnotherClassSample(); // (9)

    anotherClass.printName();                        // (10)

    anotherClass.setName("bar");                     // (11)

    anotherClass.name = "change";                    // (13)

    anotherClass.printName();                        // (12)

}

အခု ClassSample class ရဲ႕ main method ထဲမွာ name ထဲကို (၁၃)က အတိုင္းတန္ဖိုးထည့္ လိုက္တဲ့ၿပီး compile လုပ္ၾကည့္လိုက္တဲ့အခါ ေအာက္မွာျပထားတဲ့အတိုင္း error ျပတာကို ေတြ႕ရပါလိမ့္မယ္။ ဘာေၾကာင့္လဲဆိုေတာ့ အသံုးျပဳခြင့္ကန္႕သတ္ထားတာေၾကာင့္ပဲ ျဖစ္ပါ တယ္။

lesson16c

ၿပီးေတာ့ အခု “name” ကို AnotherClassSample မွာ public အေနနဲ႔ေၾကညာၾကည့္ရေအာင္။

public class AnotherClassSample

{

    // private String name;                                      // (A)

    public String name;                                          // (A')

    // Constructor

    public AnotherClassSample()                                  // (B)

    {

        System.out.println("AnotherClassSample Constructor!!");  // (C)

        name = "foo";                                            // (D)

    }

    // Set the name

    public void setName(String newName)

    {

        name = newName;                                         // (E)

    }

    // Display name

    public void printName()

    {

        System.out.println("My name is " + name + ".");          // (F)

    }

}

ၿပီးေတာ့ compile လုပ္ၾကည့္လိုက္ရေအာင္။

lesson16d

အေျဖကို တစ္ခါပဲ ျပပါလိမ့္မယ္။

lesson16e

အခုလုပ္ခဲ့တာေတြကို ၾကည့္ၿပီး နားလည္ႏိုင္မယ္လို႔ ေမွ်ာ္လင့္ပါတယ္။

တစ္ကယ္လို႔ Variableေတြကို public အေနနဲ႔ ေၾကညာခဲ့ရင္ သူ႔ကိုေၾကညာထားတဲ့class ရဲ႕အျပင္ကေန အသံုးျပဳႏိုင္ပါတယ္။

ၿပီးေတာ့ ဘယ္လို အသံုးျပဳခြင့္ကန္႔သတ္ခ်က္ေတြရိွတယ္ဆိုတာကို ေလ့လာရေအာင္။ လူအမ်ားစုက အားလံုးကို public အေနနဲ႔ေၾကညာတာ ေကာင္းတယ္လို႔ထင္ၾကတယ္။ class ထဲမွာေၾကညာထားတဲ့ fields ေတြနဲ႕ ပတ္သက္ၿပီး responsibility ကအေရးႀကီးပါတယ္။

ဥပမာအေနနဲ႔ ေအာက္က program ကိုၾကည့္ၾကည့္ရေအာင္။

// Man class

public class Man

{

    private String name;    // Registered name

    // Constructor(Assigned name)

    public Man(String assignedName)

    {

        // Register assignedName as name

        name = assignedName;

    }

    // Method to get name

    public String getName()

    {

        return name;        // Return registered name

    }

}

"Man class" ထဲမွာ "name"ကိုေၾကညာထားပါတယ္။ (သူ႕ရဲ႕“Constructor” ကိုလဲ " Man class" ထဲမွာ ေၾကညာထားပါတယ္)။

"Man class" ထဲမွာ getName method ရိွပါတယ္။ အဲဒါေၾကာင့္ "name"ကို confirm လုပ္ႏိုင္ပါတယ္။

"name"ကို "private" အေနနဲ႔ေၾကညာခဲ့မယ္ဆိုရင္ သူ႔ကိုတစ္ျခား class ေတြကေန ျပင္လို႔၊ ေျပာင္းလဲလို႔ မရႏိုင္ပါဘူး။ ၿပီးေတာ့ သူ႔ကိုျပင္ဖို႔၊ ေျပာင္းလဲဖုိ႔ method လဲမရိွပါဘူး။ (အဲဒါေၾကာင့္ "name" ကို ခြင့္ျပဳခ်က္မရိွဘဲ ေျပာင္းလဲလို႔မရႏိုင္ပါဘူး။)

တစ္ကယ္လို႔ အျခား classes ေတြကေန ေျပာင္းလဲခြင့္မျပဳခ်င္ဘူးဆို “private” အေနနဲ႔ ေၾကညာဖို႔ လိုအပ္ပါတယ္။ ဘယ္လုိလဲ။ “private” အေနနဲ႔ အသံုးျပဳႏိုင္မလား။

တစ္ကယ္လို႔ Variable တန္ဖိုးကို ခြင့္ျပဳခ်က္မရိွဘဲ တစ္ျခားclass ထဲမွာ ေျပာင္းလဲခြင့္မျပဳခ်င္ဘူးဆို “private” ကိုသံုးဖို႔ သတိရေစခ်င္ပါတယ္။

private” and “public” ေတြအျပင္ “Protected” လဲရိွေသးပါတယ္။ သူ႔ရဲ႕အေၾကာင္းကိုေတာ့ ေနာက္ပိုင္း က်မွ ရွင္းျပမွာျဖစ္ပါတယ္။

 

Summary

1. fieldတစ္ခုအေနနဲ႔ သတ္မွတ္ထားတဲ့ variableေတြကို classထဲမွာ referလုပ္လို႔ရပါတယ္။

2. Field ေတြက သူ႔ကိုေၾကညာတဲ့ပံုစံအရ ကန္႔သတ္ခ်က္ေတြ လုပ္ေဆာင္ႏိုင္ပါတယ္။

3. Classထဲမွာေၾကညာထားတဲ့ field ေတြအတြက္ class မွာတာ၀န္ရိွပါတယ္။

ေနာက္သင္ခန္းစာမွာ ျပန္ေတြ႕ၾကမယ္။

 

[Lecture 17] Permission မရိွဘဲ အသံုးျပဳခ်င္ပါလား။ method တစ္ခုကို accessလုပ္ဖို႔  limit ထားၾကည့္ရေအာင္။


Check our Facebook Page!