ප්රධාන වශයෙන් මෙම Static keyword එක යොදා ගන්නේ මතක කළමනාකරණය (memory management) සදහාය. මෙය variables, methods, blocks හා nested class වලට දැමිය හැක.
Static variables
variables එකක් ඉදිරියෙන් Static දමා Static variables සදා ගැනේ. එය class variable නමින් ද හදුන්වයි. බොහෝ විට යෙදෙන්නේ objects සියල්ලටම පෙදුවේ භාවිතා කළ හැකි property නිර්මාණය කිරීම සදහාය.
උදාහරණ-
- සේවකයින් වැඩ කරන ආයතනයක නාමය :-
සේවකයන්ට Employee කියන class එක බාවිතා කරලා අදාළ එක්කෙනාට වෙන වෙනම objects සාදා ගත හැක. ඒවා තුළ තිබෙන නම, තනතුර, වයස පුද්ගලයාගෙන් පුද්ගලයාට වෙනස් වේ. නමුත් ඔවුන් සිටින්නේ එකම ආයතනයක නම් object එකෙන් object එකට ආයතන නාමය දැමීම අවශ්ය නොවේ. මෙය පොදු variable එකක් නිසා Static කළ යුතුයි.
මෙමගින් අනවශ්ය මතකය භාවිතය අවම වේ.
- class Employee{
- int empno;
- String name;
- String company="Google";
- public Employee(int empno, String name){
- this.empno=empno;
- this.name=name;
- }
- }
ඉහත උදාහරණය සැලකුවහොත් company එක Static වී නැහැ. මෙයින් objects සිය දහස් ගණනක් සෑදීමෙන් object එකෙන් object එකට company කියන variable එකේ දත්තය මතකයේ සිය දහස් ගණනක් සෑදීමෙන් අනවශ්ය ඉඩක් ලබා ගෙන ඇත.
- class Employee{
- int empno;
- String name;
- static String company="Google";
- public Employee(int empno, String name){
- this.empno=empno;
- this.name=name;
- }
- }
ඉහත උදාහරණය සැලකුවහොත් company එක Static වී ඇත. මෙයින් objects සිය දහස් ගණනක් සෑදීමෙන් object එකෙන් object එකට company කියන variable එක සෑදෙන්නේ heap memory එකේ තැනක එක් වරක් පමණි. object කොපමණ තිබුණත් ඒ සියල්ලම company එක ලබා ගන්නේ මතකයේ එක් තැනකිනි.
Static Methods
Methodsඑකක් ඉදිරියෙන් Static දමා Static Methods සදා ගැනේ. එය class Methods නමින් ද හදුන්වයි.
- මෙය object එකකට වඩා class එකට අයිති වේ.
- මෙම Static method එකක් class එකේ instance එකක් නොසාදා ලබාගත හැක.
- static method එකට static variable එකේ දත්ත වලට access කරලා දත්ත වෙනස් කළ හැක.
උදාහරණය
- class Employee{
- int empno;
- String name;
- static String company= "ITS";
-
- static void change(){
- college = "BBDIT";
- }
- Employee(int r, String n){
- empno= r;
- name = n;
- }
- void display(){System.out.println(rollno+" "+name+" "+college);}
- }
- public class TestStaticMethod{
- public static void main(String args[]){
- Employee.change();
- Employee e1 = new Employee(111,"Karan");
- Employee e2 = new Employee(222,"Aryan");
- Employee e3 = new Employee(333,"Sonoo");
- e1.display();
- e2.display();
- s3.display();
- }
- }
static method වල සීමාවන් හා නීතී
- static method වලට static නොවන variable වල දත්ත වලට ප්රවේශ වීම හෝ static නොවන method වලට සෘජුව ප්රවේශ විය නොහැක.
- this හා super වැනි දේ මේ තුළ තිබිය නොහැක.
ක්රමලේඛය මෙම නීතී පිළිනොපදී නම් Compile Time Error සිදුවිය හැක.
Java තුළ ඇති main method එක ද static method එකකී. මෙය static නොවන method එකක් වුවහොත් අනිවාර්යෙන් object එකක් පළමුව සාදා ගෙන main method එක call කළ යුතුයි. මෙහිදි අමතර මතකයක් වෙන්කරීමේ දී ඇතිවන දෝෂ හටගනී. main method කියන්නේ Java program එකට JVM(Java Virtual Memory) එකට ඇතුල් වන මාර්ගයයි. JVM එක main method එක call කරලා Java program දියත් කරවයි.
Static Blocks
මෙය static data member නිරූපනය කීරීමට යොදා ගැනේ. class එක load කරන වෙලාවේ ඇති main method එකට මෙම Static Blocks ක්රියත්මක වේ.
- static{
- System.out.println("static block is invoked");
- }
JDK 1.6 ට පෙර තිබු Java සංස්කරණ වල ක්රමලේඛයේ main method එක නොමැතිව Static Blocks විතරක් තිබුණද ක්රියත්මක විය. නමුත් JDK 1.7 නිසා main method එක අනිවාර්යය එකක් විය.
Static Class
මෙය බොහෝ විට inner class එකකි. මන්ද Java වලදී top-level static classes සෑදීය නොහැකි බැවිනී. මෙය class එක group කිරීමේ ක්රමයකි.
- public class CarParts {
- public static class Wheel {
- public Wheel() {
- System.out.println("Wheel created!");
- }
- }
- public CarParts() {
- System.out.println("Car Parts object created!");
- }
- }
මෙම උදාහරණය caveofprogramming.com එකෙන් ගත්තේ මෙහි ධාවන ක්රමලේක පහත පරිදි වේ.
- public class App {
- public static void main(String[] args) {
- CarParts.Wheel wheel = new CarParts.Wheel();
- }
- }
මෙම static class එකට එය අඩංගු වූ class එකේ static data members ලට ප්රවේශ වියහැකි අතර static නොවන data members ලට ප්රවේශ විය නොහැක.
මෙහිදී inner class එක static class එක එකක් නොවුනොත් ඒවා ඉහත අකාරයට group කළ නොහැකි අතර ඒවායේ instances වෙන වෙනම සදාගත යුතුයි.
CarParts.Wheel wheel2 = new CarParts().new Wheel();
මෙහි ඉහත inner class එකක් වන wheel inner එක static බව ඉවත් කර ඇති අවස්ථාව දැක්වේ.