প্রোগ্রামাররা কোডিং সময় Non static method cannot be referenced from a static context এরর পায়। এটি কোনো নির্দিষ্ট IDE-এর নয়, শর্ত পূরণ হলে যেকোনো IDE-এ দেখা যায়।
বিগিনারদের সাধারণ ভুল: ক্লাসকে statically ব্যবহার করতে চান কিন্তু ইনস্ট্যান্স বানান না। Static ক্লাস/মেথড ব্যবহারে কিছু শর্ত মেনে চলতে হয়।
Static Method কী?
মেথডে static কিওয়ার্ড দিলে সেটি Static Method হয়। এটি অবজেক্টের বদলে ক্লাসের সাথে বান্ধব। ইনস্ট্যান্স বানানো ছাড়া কল করা যায়।
Static Method দিয়ে Static Data Member পরিবর্তন করা যায়। কিন্তু Non-static ফিল্ড এক্সেস করতে Non-static মেথড লাগে। Static Method কম ব্যবহার হয় কিন্তু উপকারী।
উদাহরণ:
class Students{
int roll_no;
String name;
static String college = "InformationTech";
static void change(){
college = "Management";
}
Students(int number, String name_self){
roll_no = number;
name = name_self;
}
void display(){
System.out.println(roll_no+" "+name+" "+college);
}
public static void main(String args[]){
Students.change();
Students stu_1 = new Students(100,"Mexican");
Students stu_2 = new Students(202,"American");
Students stu_3 = new Students(309,"British");
stu_1.display();
stu_2.display();
stu_3.display();
}
}
আউটপুট:
100 Mexican Management 202 American Management 309 British Management
Class এবং Instance of a Class-এর পার্থক্য
রাস্তায় একটি গাড়ি দেখে আপনি বুঝতে পারেন এটি 'Car' ক্লাসের। ক্লাস মানে টেমপ্লেট বা আইডিয়া। নিকট যাওয়ায় মডেল, হাওয়ারপাওয়ার, রিমস্ব 돌아와 — এটিই 'Instance'।
Object-Oriented Programming-এ ক্লাস ডিফাইন করে ফিল্ড (যেমন color) যোগ করুন। ইনস্ট্যান্সিয়েট করলে মেমরি রিজার্ভ হয়, পরে ভ্যালু (Red) দিন। এগুলো Non-static।
Static মেথড/ফিল্ড সব ইনস্ট্যান্স শেয়ার করে। ক্লাস-স্পেসিফিক ভ্যালু/আইটেমের জন্য (যেমন StringToInt কনভার্টার, Car Type যদি শুধু নরমাল কার হয়)।
Issue ১: যা অস্তিত্ব নেই সেটি কল করা হচ্ছে
Static মেথড Non-static মেথড কল করলে এরর। উদাহরণ:
private java.util.List<String> someMethod(){ /* Some Code */ return someList; }
public static void main(String[] strArgs){
java.util.List<String> someList = someMethod(); // Error
}
Static main() ইনস্ট্যান্স ছাড়া someMethod() কল করতে চায়। OOP-এ ডেটা ও অপারেশন একসাথে এনক্যাপসুলেট रहता। অবজেক্ট ছাড়া ইনস্ট্যান্স ডেটা নেই, ইনস্ট্যান্স মেথডও অবজেক্ট ছাড়া ডেটা পায় না। Static মেথড কখনওই একজিস্ট করে (ডেফিনিশনের কারণে)।
সমাধান: অবজেক্ট তৈরি করুন বা মেথড Static করুন।
Issue ২: মেথডগুলো Static করা হয়নি
Static main()-এ ইনস্ট্যান্স ছাড়া মেথড কল করলে এরর।
public class BookStoreApp2 {
Scanner input = new Scanner(System.in);
public static void main(String[] args) {
printMenu(); // Error
getUserChoice(); // Error
...
}
}
printMenu() ও getUserChoice() Static করতে হবে। অথবা Constructor ব্যবহার করুন:
public BookStoreApp2() {
// main()-এর কন্টেন্ট এখানে
}
public static void main(String[] args) {
new BookStoreApp2();
}
এই প্রিন্সিপ্যাল মেনে কোড রিচেক করুন।