Saturday, July 10, 2010

ජාවා තුල Abstract Classes යොදාගන්නා අයුරු

වස්තු පාදක(OO) ජාවා වැඩසටහන් ලිවීමේදී බහුල වශයෙන් යෙදෙන සංකල්පයක් තමයි abstraction කියන්නේ මේ සඳහා ජාවා පරිගණක භාෂාව තුල පහසුකම් සපයාතිබෙනවා. 

අපි මුලින්ම බලමු abstract class එකක ලක්ෂණ මොනවාද කියල.
  • Abstract class වලින් කිසිවිටෙකත් objects සෑදිය නොහැක.

  • Abstract class එකක් extend කර(inherit කර) පසුව සාදනු ලබන class වලට හොඳ පදනමක් සැපයීම.

  • Generic (පොදු) ස්වභාවයකින් යුතුවීම.  එනම් abstract class එකෙහි child class වලට පොදු ලක්ෂණ එතුල කැටිවී තිබීම(උදාහරණය මගින් විස්තර කර ඇත.)

  • Parent class එකෙහි Abstract methods ඇත්න්නම් එහි sub class නොහොත් child classes වලදී එම abstract methods අනිවාර්‍යයෙන්ම override කල යුතුය(override කරනවා යන්නෙහි සරල අදහස නම් අදාල abstract method එකෙහි body එක implement කල යුතු බවයි) 
දැන් අපි උදාහරණය බලමු
class : AbstractDemo.java
/**   
*class  : AbstractDemo   
*Author : Kanishka Dilshan   
*Purpose: Describe abstract concept in Java 
*Blog   : http://javaxclass.blogspot.com   
*/   

abstract class Shape{
 protected int color;
 protected Point pos; //position
 
 public void setColor(int color){
  this.color=color;
 }
 
 public int getColor(){
  return color;
 }
 
 public void setPos(Point p){
  pos=p;
 }
 
 public Point getPos(){
  return pos;
 }
 
 abstract public float getArea();
  /* This method is defined as abstract since
     it cannot be implemented since Shape is a  
     common class(abstract class) */
}

class Rectangle extends Shape {
 /*since this clsaa inherits Shape class
  *the getArea() method must be overrided
  */
  //thease are properties specific to a Rectangle
  private float width,height;
  
  public Rectangle(float w,float h,Point p,int col){
  super.color=col;
  super.pos=p;
  this.width=w;
  this.height=h;
  }
  
  public float getArea(){
  return (width*height);
  } 
}

class Circle extends Shape {
 /*since this clsaa inherits Shape class
  *the getArea() method must be overrided
  */
  private float radius;
  
  public Circle(float rad,Point p,int col){
  super.color=col;
  super.pos=p;  
  this.radius=rad;
  }
  
  public float getArea(){
  return (float)(Math.PI*Math.pow(radius,2));
  }   
}

class Point{
 //class definition for represent a Point
 protected int xPos;
 protected int yPos;
 public Point(int x,int y){
  xPos=x;
  yPos=y;
 }
 
 public int getX(){
  return xPos;
 } 
 
 public int getY(){
  return yPos;
 }
}


public class AbstractDemo{
 //main method
 public static void main(String args[]){
  Rectangle rect1=new Rectangle(12.0f,7.5f,new Point(10,-3),255);
  Circle c1=new Circle(4.3f,new Point(3,8),100);
  
  //let's prnint object details for rect1
  println("rect1 belongs to    : "+ rect1.getClass().toString());
  println("colour val of rect1 : "+ rect1.getColor());
  println("x position of rect1 : "+ rect1.getPos().getX());
  println("y position of rect1 : "+ rect1.getPos().getY());
  println("area of rect1       : "+ rect1.getArea() );
  
  println("-----------------------------------------");
  //let's prnint object details for c1
  println("c1 belongs to       : "+ c1.getClass().toString());
  println("colour val of c1    : "+ c1.getColor());
  println("x position of c1    : "+ c1.getPos().getX());
  println("y position of c1    : "+ c1.getPos().getY());
  println("area of c1          : "+ c1.getArea() );
 }
 
 public static void println(Object o){
  System.out.println(o);
 }

}
output :
අපි දැන් ඉහත code එක විස්තරාත්මකව අධ්‍යයනය කරමු
අපි abstract class එක ලෙස මෙහිදී යොදාගෙන තිබෙන්නේ Shape නම් class එකයි. එයට හේතුව වනුයේ Circle සහ Rectangle යන class දෙකටම පොදු ලක්ෂණ Shape තුල අන්තර්ගත වන නිසයි. 

Line 28
abstract public float getArea();
මෙහි getArea() නම් method එක abstract ලෙස සටහන් කර ඇත්තේ එය Shape හි sub classes වලට (specific) අනන්‍ය නිසා Shape class එක තුල implement කල නොහැකි නිසාය.

Line 48 - 50
public float getArea(){
  return (width*height);
  }
මෙහිදී Rectangle class එකෙහි super class එක වන Shape class එකෙහි ඇති abstract method එක implement කර ඇත. super class එකෙහි abstract method යම් ප්‍රමාණයක් ඇත්නම් ඒ සියල්ලම එහි subclasses වලදී implement කිරීම අනිවාර්‍ය වේ.
මෙම පාඩමෙන් අප ලබාගත් දැණුම මීලඟ පාඩම වන interfaces පාඩමේදී අත්‍යාවශ්‍ය වන නිසා මෙය හොඳින් අධ්‍යයනය කරන්න.

මෙහි ගැටලු සහගත තැනක් වේ නම් email එකක් මගින් දන්වන්න නැත්නම් comment එකක් ලෙස හෝ ඉදිරිපත් කරන්න.

පාඩමේ භාවිතා කර ඇති මූලාශ්‍ර කේත(source codes) බාගත කරගැනීම සඳහා පහත ලින්ක් එක භාවිතා කරන්න.

Saturday, July 3, 2010

ජාවා තුල Inner Classes හි භාවිතය

අපි අද පාඩමෙන් කතාකරන්න යන්නේ ජාවා inner classes පිලිබඳවයි. පරිගණක භාෂාවක් ලෙසට ජාවා වැනි භාෂාවක් හොඳින් අධ්‍යයනය කිරීම ඉතාම වැදගත්. ඒ මොකද, OOP සංකල්ප පැහැදිලිව අවබෝධ කරගැනීමට ජාවා අධ්‍යයනය මහත් රුකුලක් වන නිසා.
අපි දැන් සරළ රූප සටහනක් මගින් මෙම inner class සංකල්පය අවබෝධ කරගනිමු.
දැන් අපි ඉහත රූපසටහන විස්තරාත්මකව අධ්‍යයනය කරමු.
class B යනු class A හි inner class එකකි එනම් මෙහිදී class B හි outer class එක වන්නේ class A වෙයි. එමෙන්ම class C ද class A හි inner class එකකි. class D යනු class C හි ද inner class එකකි. එනම් class D හි outer class එක වන්නේ class C ය, class C හි outer class එක class A ය. දැන් ඔබට මෙහිදී සිදුවන්නේ කුමක්ද යන්න පැහැදිලි ඇතැයි සිතමි. outer class සහ inner class ගැන පැහැදිලි දල අවබෝධයක් පාඩමේ පහත කොටසට අවශ්‍ය නිසා මෙහිදී එය පැහැදිලි කරගන්න.

අපි දැන් බලමු inner classes වල ප්‍රධාන ලක්ෂණ මොනවාද කියලා.

► Outer class වලට ඒවායේ inner classes import කිරීමකින් තොරව භාවිතා කල හැකිය. උදා : ඉහත සටහනේ class A ට ඕනෑම විටක class B භාවිතා කල හැකිය(objects සෑදිය හැකිය)

► නමුත් inner classes භාවිතා කල හැක්කේ ඒවායේ outer class වලට පමනි. ඉන් පරිභාහිර කිසිඳු class එකකට සෘජුව අදාල inner classes භාවිතා කල නොහැක. උදා : class A ට පරිබාහිර වෙනත් කිසිඳු class එකකට class B access කල නොහැක.

►Inner class එකක් යනු එහි outer class එකෙහි member කෙනෙක් ලෙස සැලකිය හැක.

►Inner class එකකට එහි outer class එකෙහි ඕනෑම attributes හෝ methods සෘජුව access කල හැක.

►නමුත් Outer class එකකට එහි inner classes වල  attributes හෝ methods සෘජුව access කල නොහැක. එම inner class වලින් object සෑදීමෙන් අනතුරුව ඒ හරහා එම methods සහ attribute access කල හැක.

inner classes ආදර්ශනය කිරීමට ලියන ලද පහත වැඩසටහන සැලකිල්ලෙන් අධ්‍යයනය කරන්න.
/**  
*class  : InnerClsDemo  
*Author : Kanishka Dilshan  
*Purpose: Demonstrate how inner classes are manipulated
*Blog   : http://javaxclass.blogspot.com  
*/  

public class InnerClsDemo{
 public static void main(String args[]){
  Report rpt1=new Report("Sri Lanka","I love my country","End of the DOC");
  rpt1.print();
 }
}

class Report {
 String headerTxt;
 String bodyTxt;
 String footerTxt;
 
 public Report(String h,String b,String f){
  headerTxt=h;
  bodyTxt=b;
  footerTxt=f;
 }
 
 public void print(){
  Header h=new Header();
  Body b=new Body();
  Footer f=new Footer();
  h.print();
  b.print();
  f.print();
 }
 
 //inner class 1: Header
 class Header{
  public void print(){
   System.out.println("-----------------------------");
   System.out.println("------This is The Header-----");
   System.out.println("\t"+headerTxt);
   System.out.println("-----------------------------");   
  }
 }
 //inner class 2: Body
 class Body{
  public void print(){
   System.out.println("-                           -");
   System.out.println("-                           -");
   System.out.println("------This is The Body-------");   
   System.out.println("\t"+bodyTxt);   
   System.out.println("-                           -");   
  }
 }
 //inner class 3: Footer
 class Footer{
  public void print(){
   System.out.println("------This is The Footer-----");
   System.out.println("\t"+footerTxt);
   System.out.println("-----------------------------");       
  }
 } 
}
output:
අපි ඉහත ඉගෙනගත් inner classes මූලධර්ම මගින් ඔබට ඉහත වැඩසටහන පැහැදිලි කරගත හැකිය.

inner classes compile කිරීමෙන් අනතුරුව file system එකේ තැන්පත් වන ආකාරය දැන් බලමු.
outer class එක වන Report class එක Report.class ලෙස පවතින බව ඔබට පෙනෙනවා ඇති. එම Report නම් outer class එකෙහි inner classes වන Header , Body සහ Footer classes පිලිවෙලින් Report$Header.class , Report$Body.class සහ Report$Footer.class ලෙස පවතින බවත් පෙනෙනවා ඇති. එනම් inner class එකට අදාල class file එකට නම ලැබී ඇත්තේ එහි outer class එකට ඇති සම්බන්දය විද්‍යාමන කරවමිනි. 
(OuterClassName$InnerClassName.class)

මීලඟ පාඩමෙන් අපි ජාවා interface පිලිබඳව සාකච්ඡා කරමු.

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 සංකල්ප අපි ඉදිරි පාඩමකදී සාකච්ඡා කරමු. 

Friday, June 18, 2010

ජාවාහි එන Wrapper classes යනු මොනවාද..?

ඔබ දන්නවා ජාවා වැඩසටහන තිබෙනවා මූලික දත්ත ආකාර(primitive data types) 8ක්. ජාවාහි සෑම තැනකටම පොදු ඔබ්ජෙක්ට් ඔරියන්ටඩ් ගතිය මෙම primitive data types තුල නැති බව බැලූ බැල්මටම පෙනෙනවා. මෙම wrapper classes නිර්මාණය කර ඇත්තේ මෙම primitive data type 8 සඳහා objects සෑදීමේ හැකියාව ලබාදීමටයි. එම නිසා ජාවා 1.0 සංස්කරණයේ සිටම මෙම primitive data types 8 සඳහා wrapper class 8ක් පැමිණෙනවා මේවා java.lang පැකේජයේ අන්තර්ගත වන නිසා වැඩසටහනකට විශේෂයෙන් import කිරීමට අවශ්‍ය නැහැ.

මෙම  wrapper classes යොදාගෙන ජාවාහි ඉතා වැදගත් කාර්‍යභාරයක් කරගැනීමට පුලුවන්. data types convert කිරීම මෙවායේ සුලභ යෙදීමක්.  මීට අමතරව එම දත්ත ආකාරය ගැන වැඩි විස්තර මෙම wrapper classes යොදාගනිමින් අපට ලබාගන්නටද පුලුවන්.

Primitive type Wrapper class

boolean

Boolean

char

Character

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double


අපි දැන් බලමු wrapper class යොදගෙන ලියන ලද සරල වැඩසටහනක්.

public class Wrapper{
 public static void main(String args[]){
  Integer num1=new Integer(23);
  Integer num2=new Integer(34);
  Integer tot1=new Integer(num1+num2);
  Integer tot2=num1+num2;
  
  System.out.println("tot1 : " + tot2);
  System.out.println("tot2 : " + tot1);
 }
}
ඉහත වැඩසටහන නිරීක්ෂණයෙන් ඔබට පෙනෙනවා ඇති ක්‍රම 2කකට අපි num1 හා num2 හි එකතුව ලබාගෙන තිබෙනවා. ජාවා 1.5 න් පසු සංස්කරණ වලදී නම් මෙම 2 ක්‍රම 2ම දෝශ රහිතයි නමුත් ඊට පෙර සංස්කරණයන්හි 2වන ක්‍රමය එනම් 6 වන පේලියේ ඇති ක්‍රමය දෝශ සහගතයි. Integer class type එක ඇති ඔබ්ජෙක්ට් එකකට int primitive type එකක් assign කිරීම ඇත්තටම වරදක්. නමුත් ජාවා 1.5න් පසු සංස්කරණ වලදී එලෙස assign කර ඇති අගය සුදුසු wrapper class type එකට convert කිරීමෙන් අනතුරුවයි assign කිරීම සිදුකරන්නේ. මෙය autoboxing ලෙසත් හඳුන්වනවා.

දැන් අපි බලමු මෙම wrapper classes භාවිතාකර data types convert කරන ආකාරය. මේ සඳහා ලියන ලද සරළ ජාවා වැඩසටහන බලමු.
public class Wrapper{
 public static void main(String args[]){
  String str1="23.44";
  String str2="44.76";
  float val1=Float.parseFloat(str1);
  float val2=Float.parseFloat(str2);

  System.out.println("str1 \t => " + str1);
  System.out.println("str2 \t => " + str2);
  System.out.println("String Data\t=> "+str1+str2);
  System.out.print("float  Data\t=> ");
  System.out.println(val1+val2);
 }
}
 line 5 හා line6 දී සිදුකර ඇත්තේ str1 හා str2 යන String data val1 හා val2 ලෙස float ඩේටා බවට පත්කිරීමයි. ඒ ආකාරයට wrapper class අටේම ඇති parseXXX methods (parseInt(),parseFloat(),parseDouble()...) දත්ත භාවිතා කර අපිට අවශ්‍ය data type වලට convert කරගන්න පුලුවන්.

දැන් අපි wrapper classes භාවිතා කර යම් data type එකකට දැරිය හැකි උපරිම හා අවම අගයන් ලබාගැනීමට වැඩසටහනක් ලියමු.
public class Wrapper{
 public static void main(String args[]){
  
  System.out.println("Byte wrapper"+"\t_______________");
  System.out.println("Max value : "+Byte.MAX_VALUE);
  System.out.println("Min value : "+Byte.MIN_VALUE);
  System.out.println();

  System.out.println("Integer wrapper"+"\t_______________");
  System.out.println("Max value : "+Integer.MAX_VALUE);
  System.out.println("Min value : "+Integer.MIN_VALUE);  
  System.out.println();

  System.out.println("Long wrapper"+"\t_______________");
  System.out.println("Max value : "+Long.MAX_VALUE);
  System.out.println("Min value : "+Long.MIN_VALUE); 
  System.out.println();
  
  System.out.println("Float wrapper"+"\t_______________");
  System.out.println("Max value : "+Float.MAX_VALUE);
  System.out.println("Min value : "+Float.MIN_VALUE); 
  System.out.println(); 
  
  System.out.println("Double wrapper"+"\t_______________");
  System.out.println("Max value : "+Double.MAX_VALUE);
  System.out.println("Min value : "+Double.MIN_VALUE); 
  System.out.println();
 }
}
ප්‍රථිඵලය:

Source: Java Documentation

Thursday, June 17, 2010

ජාවා වැඩසටහනකින් Keyboard Inputs ලබාගන්නා අයුරු :: (Accessing the standard input stream)

ජාවා භාවිත යෙදුම්(Java Aplications)  Desktop applications හා Console applications  වශයෙන් මූලික ආකාර 2ක් තිබෙනවා .  Desktop applications සඳහා textbox වැනි component භාවිතාකර user inputs ලබාගන්න පුලුවන් මේ සඳහා awt හා swing ලෙස ජාවා පැකේජ 2ක් හඳුන්වාදී තිබෙනවා. නමුත් console application යනු console එක(windows වලදී command prompt එක) ක්‍රියාකරන ආකාරය අනුව කොන්සෝල් එකෙදී inputs ලබාගැනීමට වන්නේ keyboad එක මගින් ලබාදෙන string එකක් වශයෙන්. අපි අද පාඩමෙන් අධ්‍යයනය කරන්නේ කොන්සෝල් එක මගින් user input එකක් ලබාගන්නා අයුරුයි.