Wednesday, June 23, 2010

ජාවා static members කියන්නේ මොනවාද? මොකටද යොදාගන්නේ?

Static කියන්නේ ස්ථිතික කියන එකනේ සරලව කිව්වොත් පැතිරීයන ස්වභාවය නැති කියන එක ඉතින් මේ ස්ථිතික ස්වභාවය ජාවා වැඩසටහන් වලට ලබාදීමට තමයි මෙම static ලක්ෂණය  ජාවා වලට හඳුන්වාදී තිබෙන්නේ. මේ සඳහා static නම් keyword එක භාවිතා වනවා. සාමාන්‍යයෙන් static modifier එක යොදා ඇති fields බැඳී තිබෙන්නේ class එක සමගයි. static members වර්ග දෙකක් තිබෙනවා ඒ තමයි
  1.  Class variables
  2. Class methods
අපි දැන් class variables ගැන බලමු. ඔබ දන්නවා සමාන්‍ය instance variable නම් object එකකට එක බැගින් තිබෙනවා. උදාහරණයක් ලෙස Student class එකේ studentName එක instance variable එකක්. එනිසා එය Student object එකකට අනන්‍ය(unique) ලෙස පවතිනවා. සරලව කිව්වොත් සෑම object එකකටම studentName කියල වෙන වෙනම instance පවතිනවා. නමුත් කිසියම් static variable එකක් නැත්නම් class variable එකක් Student class එකේ තියනවා නම් සෑම object එකකටම එක බැගින් static members නෑ. එකම memory location එකක ඇති variable එකක් ලෙසටයි පවතින්නේ. සෑම object එකක්ම එය share කරගැනීම සිදුවෙනවා. එනම් object 1000ක් තිබුනොත් instance variable නම් 1000ක් පවතිනවා නමුත් static variable නම් පවතින්නේ එකම එකයි. පහත ඉදිරිපත්කර ඇති උදාහරණය අධ්‍යයනය කිරීමෙන් ඔබට මේ ගැන අවබෝධ කරගැනීමට පහසු වේවි.

උදාහරණයට කලින් static methods නැතහොත් class methods ගැනත් බලලම ඉඳිමු. static methods පොදුවේ භාවිතා වන්නේ class එකෙන් objects සෑදීමෙන් තොරව අදාල method එක භාවිතා කිරීමටයි. class එකක් තුල ඇති static variable හි අගයන් පිටතට ගැනීමට(access කිරීමට) මෙම static methods භාවිතා කලයුතු වනවා. මෙම static methods invoke(call) කිරීම සිදුවන්නේ class එකේ නම හරහායි.

දැන් අපි static සංකල්පය යොදාගැනීමට භාවිතා කරන syntax ගැන අධ්‍යයනය කරමු.
Syntax 1 : Declaring a static variable
[access modifier] static [datatype] [variable__name]  ;
 ex: private static int studID; 
Syntax 2 : Declaring a static method
[access modifier] static [datatype] [method__name]() 
ex: public static int getSum()

දැන් අපි උදාහරණය බලමු
/** 
*class  : StaticDemo 
*Author : Kanishka Dilshan 
*Purpose: introduce static keyword in Java 
*Blog   : http://javaxclass.blogspot.com 
*/ 

class Student {
 private String name;
 private int studId;
 private static int numberOfStudents;

 public Student(String name){
  this.name=name;
  //generate a new ID and increment the total value by 1
  studId=1000+(numberOfStudents++);
 }
 
 public static int getNumberOfStuds(){
  return numberOfStudents;
 }
 
 public void showStudDetails(){
  System.out.println("Name : " + name);
  System.out.println("stID : " + studId);
 }
}


public class StaticDemo{
 public static void main(String args[]){
  Student std1=new Student("Sajith");
  Student std2=new Student("Kanishka");
  Student std3=new Student("Ravindu");
  Student std4=new Student("Sathiranga");

  std1.showStudDetails();
  std2.showStudDetails();
  std3.showStudDetails();
  std4.showStudDetails();
  System.out.println("Total students : " + Student.getNumberOfStuds());
  
 }
}
ප්‍රතිඵලය:
පැහැදිලි කිරීම:
මෙහි name හා studId යන ඒවා instance variable වේ. numberOfStudents යන්න static variable එකකි. student ලා කීයක් ඉන්නවද කියන තමයි numberOfStudents එකේ තබාගන්නේ එය object එකින් එකට වෙනස් වන අගයක් නොවේ. එනිසයි අපි numberOfStudents යන්න static ලෙස යොදාගෙන තිබෙන්නේ. තවද මෙහි getNumberOfStuds() යන method එකත් static මොකද එයත් object එකින් එකට වෙනස් වන්නේ නැහැ(මින් අදහස් කිරීමට උත්සාහ කලේ ඔබ්ජෙක්ට් සඳහා අනන්‍ය ptoperties එම මෙතඩ් එක තුලින් පිවිසිය(access) නොහැකිය යන්නයි.) අනික එම method එක numberOfStudents නම් static variable එකත් access කරනවා. එම නිසා එය static විය යුතුයි. එමනිසා class එකේ නමයොදාගෙන call කිරීම කලහැකියි 41 වන පේලියේදී ඔබට මෙය දැකගත හැකියි.
තවත් OOP සංකල්ප අපි ඉදිරි පාඩමකදී සාකච්ඡා කරමු. 

5 comments:

  1. nice work thnx a lotttttttttttt

    ReplyDelete
  2. තවද මෙහි showStudDetails() යන method එකත් static මොකද එයත් object එකින් එකට වෙනස් වන්නේ නැහැ Machan methana waraddakk thiyenwa kiyala mata danenwa poddak ethana pahadili karapan .

    ReplyDelete
  3. @Anonymous February 12, 2014 at 10:44 PM
    ගොඩක් ස්තුතියි මේ වැරදි තැන පෙන්වා දුන්නට. ඒක නිවැරදි වෙන්න ඕන

    showStudDetails එක නෙවෙයි getNumberOfStuds() මෙතඩ් එකයි static වෙන්නෙ. getNumberOfStuds මෙතඩ් එක static නිසා අදාල ඔබ්ජෙක්ට් වලට අනන්‍ය(specific) properties ඒකෙන් ඇක්සස් කරන්න්නෙ නෑ. ඒකයි මම එතන අදහස් කරන්න උත්සාහ කලේ.

    නැවත ස්තුතියි එය නිවැරදි කිරීම පිනිස පෙන්වා දුන්නට.

    ReplyDelete
  4. @Anonymous February 12, 2014 at 10:44 PM
    එතන නිවැරදි කලා මචන්. ස්තුතියි.

    ReplyDelete