ওহে! আপনি ইতিমধ্যে ক্ষেত্র এবং পদ্ধতি সহ আপনার নিজস্ব ক্লাস তৈরি সম্পর্কে জানেন। এখন আমরা পদ্ধতিগুলি নিয়ে আলোচনা করব।
অবশ্যই, আমরা ইতিমধ্যে আমাদের পাঠে একাধিকবার এটি করেছি, তবে আমরা প্রধানত সাধারণ বিষয়গুলি কভার করেছি। আজ, আমরা পদ্ধতিগুলিকে ব্যবচ্ছেদ করতে যাচ্ছি, এবং সেগুলি কী দিয়ে তৈরি, সেগুলি তৈরি করার বিভিন্ন উপায় এবং কীভাবে এটি পরিচালনা করা যায় তা অধ্যয়ন করব৷ :) চলো যাই!
পদ্ধতি ঘোষণা
একটি পদ্ধতি সংজ্ঞায়িত করে এমন সমস্ত কোডকে একটি পদ্ধতি ঘোষণা বলা হয় । একটি পদ্ধতি ঘোষণার সাধারণ ফর্ম নিম্নরূপ বর্ণনা করা যেতে পারে:
access modifier, return type, method name (parameter list) {
// method body
}
উদাহরণ হিসাবে, ক্লাসের বিভিন্ন পদ্ধতির ঘোষণাগুলি দেখুন Dog
।
public class Dog {
String name;
public Dog(String name) {
this.name = name;
}
public static void main(String[] args) {
Dog max = new Dog("Max");
max.woof();
}
public void woof() {
System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}
public void run(int distanceInFeet) {
System.out.println("A dog named " + name + " ran " + distanceInFeet + " feet!");
}
public String getName() {
return name;
}
}
1. অ্যাক্সেস মডিফায়ার
অ্যাক্সেস মডিফায়ার সর্বদা প্রথমে নির্দেশিত হয়। ক্লাসের সমস্ত পদ্ধতি পাবলিক মডিফায়ারDog
দিয়ে চিহ্নিত করা হয়েছে । এর মানে আমরা তাদের অন্য কোনো ক্লাস থেকে কল করতে পারি:
public class Main {
public static void main(String[] args) {
Dog butch = new Dog("Butch");
butch.run(100);
}
}
আপনি দেখতে পাচ্ছেন, Dog
ক্লাসের পদ্ধতিগুলি ক্লাসে সহজেই অ্যাক্সেস করা যায় Main
। পাবলিক মডিফায়ারের কারণে এটি সম্ভব । জাভাতে, অন্যান্য সংশোধক রয়েছে। তারা সব পদ্ধতি অন্য ক্লাসে ব্যবহার করার অনুমতি দেয় না। আমরা অন্যান্য পাঠে তাদের সম্পর্কে কথা বলব। মনে রাখা প্রধান জিনিস হল পরিবর্তনকারী কি জন্য দায়ী: একটি পদ্ধতি অন্যান্য ক্লাসে অ্যাক্সেসযোগ্য কিনা :)
2. স্ট্যাটিক কীওয়ার্ড
একটিDog
পদ্ধতি, main()
, কীওয়ার্ড স্ট্যাটিক দিয়ে চিহ্নিত করা হয়েছে । এটি পদ্ধতি ঘোষণার অংশ, এবং আমরা ইতিমধ্যে এর অর্থ জানি। আমরা পাঠের শুরুতে প্রদত্ত পদ্ধতি ঘোষণা টেমপ্লেটে এটি উল্লেখ করিনি, কারণ এটি ঐচ্ছিক। যদি এটি নির্দিষ্ট করা হয়, তবে এটি অবশ্যই অ্যাক্সেস মডিফায়ারের পরে আসতে হবে। মনে রাখবেন যে সাম্প্রতিক পাঠে আমরা স্ট্যাটিক (শ্রেণী) ভেরিয়েবল সম্পর্কে কথা বলেছিলাম? পদ্ধতিতে প্রয়োগ করা হলে, এই কীওয়ার্ডটি মোটামুটি একই অর্থ বহন করে। যদি একটি পদ্ধতি স্ট্যাটিক হয় , তাহলে এটি ক্লাসের একটি নির্দিষ্ট বস্তুর উল্লেখ ছাড়াই ব্যবহার করা যেতে পারে। Dog
এবং প্রকৃতপক্ষে, স্ট্যাটিক main()
পদ্ধতিটি চালানোর জন্য আপনার কোন বস্তুর প্রয়োজন নেইDog
ক্লাস এটি একটি ছাড়াই ঠিক চলবে। যদি এই পদ্ধতিটি স্থির না হয়, তবে এটি চালানোর জন্য আমাদের প্রথমে একটি বস্তু তৈরি করতে হবে।
3. রিটার্ন মান
যদি আমাদের পদ্ধতিতে কিছু রিটার্ন করা উচিত, তাহলে আমরা রিটার্ন মানের ধরন নির্দিষ্ট করি। এটি গেটারের উদাহরণ থেকে স্পষ্টgetName()
:
public String getName() {
return name;
}
এটি একটি String
বস্তু প্রদান করে। যদি একটি পদ্ধতি কিছু ফেরত না দেয়, তাহলে এর পরিবর্তে কীওয়ার্ড void ব্যবহার করা হয়, যেমন পদ্ধতিতে woof()
:
public void woof() {
System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}
একই নামের পদ্ধতি
এমন পরিস্থিতি রয়েছে যখন আমরা একটি পদ্ধতিকে কল করার জন্য বিভিন্ন উপায় চাই। কেন আমাদের নিজেদের কৃত্রিম বুদ্ধিমত্তা তৈরি করা হয় না? অ্যামাজনের অ্যালেক্সা আছে, অ্যাপলের সিরি আছে, তাহলে কেন আমাদের একটি থাকা উচিত নয়? :) আয়রন ম্যান মুভিতে, টনি স্টার্ক তার নিজের অবিশ্বাস্য কৃত্রিম বুদ্ধিমত্তা জার্ভিস তৈরি করেন। আসুন সেই দুর্দান্ত চরিত্রের প্রতি শ্রদ্ধা নিবেদন করি এবং তার সম্মানে আমাদের AI এর নাম রাখি। :) আমাদের প্রথমে যা করতে হবে তা হল জার্ভিসকে যারা ঘরে প্রবেশ করে তাদের হ্যালো বলতে শেখানো (এটি অদ্ভুত হবে যদি এমন একটি আশ্চর্যজনক বুদ্ধি অসভ্য হয়ে ওঠে)।
public class Jarvis {
public void sayHi(String name) {
System.out.println("Good evening, " + name + ". How are you?");
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark");
}
}
কনসোল আউটপুট: শুভ সন্ধ্যা, টনি স্টার্ক। আপনি কেমন আছেন? খুব ভালো! জার্ভিস এখন অতিথিদের স্বাগত জানাতে সক্ষম। অবশ্যই, আরো প্রায়ই এটা তার মাস্টার হবে, টনি স্টার্ক. কিন্তু সে একা না আসলে কী হবে! কিন্তু আমাদের sayHi()
পদ্ধতি শুধুমাত্র একটি যুক্তি গ্রহণ করে। এবং তাই এটি কেবলমাত্র একজন ব্যক্তিকে ঘরে প্রবেশ করে অভিবাদন জানাতে পারে এবং অন্যটিকে উপেক্ষা করবে। খুব ভদ্র না, রাজি? :/ এই ক্ষেত্রে, আমরা একই নামের সাথে 2টি পদ্ধতি লিখে সমস্যার সমাধান করতে পারি, কিন্তু ভিন্ন প্যারামিটার:
public class Jarvis {
public void sayHi(String firstGuest) {
System.out.println("Good evening, " + firstGuest + ". How are you?");
}
public void sayHi(String firstGuest, String secondGuest) {
System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
}
}
একে মেথড ওভারলোডিং বলা হয় । মেথড ওভারলোডিং আমাদের প্রোগ্রামকে আরও নমনীয় হতে দেয় এবং কাজ করার বিভিন্ন উপায়কে মিটমাট করে। আসুন এটি কীভাবে কাজ করে তা পর্যালোচনা করা যাক:
public class Jarvis {
public void sayHi(String firstGuest) {
System.out.println("Good evening, " + firstGuest + ". How are you?");
}
public void sayHi(String firstGuest, String secondGuest) {
System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark");
jarvis.sayHi("Tony Stark", "Captain America");
}
}
কনসোল আউটপুট: শুভ সন্ধ্যা, টনি স্টার্ক। আপনি কেমন আছেন? শুভ সন্ধ্যা, টনি স্টার্ক এবং ক্যাপ্টেন আমেরিকা। আপনি কেমন আছেন? চমৎকার, উভয় সংস্করণই কাজ করেছে। :) কিন্তু আমরা সমস্যার সমাধান করিনি! তিনজন অতিথি থাকলে কি হবে? আমরা অবশ্যই, sayHi()
পদ্ধতিটি আবার ওভারলোড করতে পারি, যাতে এটি তিনটি অতিথির নাম গ্রহণ করে। কিন্তু 4 বা 5 হতে পারে। অনন্ত পর্যন্ত সব পথ। sayHi()
পদ্ধতিটি এক মিলিয়ন বার() ওভারলোড না করে জার্ভিসকে যে কোনও সংখ্যক নাম পরিচালনা করতে শেখানোর আরও ভাল উপায় কি নেই ? :/ অবশ্যই আছে! যদি না থাকত, আপনি কি মনে করেন জাভা বিশ্বের সবচেয়ে জনপ্রিয় প্রোগ্রামিং ভাষা হবে? ;)
public class Jarvis {
public void sayHi(String...names) {
for (String name: names) {
System.out.println("Good evening, " + name + ". How are you?");
}
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark");
System.out.println();
jarvis.sayHi("Tony Stark", "Captain America");
}
}
যখন ( String... names ) একটি প্যারামিটার হিসাবে ব্যবহার করা হয়, তখন এটি নির্দেশ করে যে স্ট্রিংগুলির একটি সংগ্রহ পদ্ধতিতে পাস করা হবে। কতজন থাকবে তা আমাদের আগে থেকে নির্দিষ্ট করতে হবে না, তাই এখন আমাদের পদ্ধতি অনেক বেশি নমনীয়:
public class Jarvis {
public void sayHi(String...names) {
for (String name: names) {
System.out.println("Good evening, " + name + ". How are you?");
}
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
}
}
কনসোল আউটপুট: শুভ সন্ধ্যা, টনি স্টার্ক। আপনি কেমন আছেন? শুভ সন্ধ্যা, ক্যাপ্টেন আমেরিকা। আপনি কেমন আছেন? শুভ সন্ধ্যা, কালো বিধবা। আপনি কেমন আছেন? শুভ সন্ধ্যা, হাল্ক। আপনি কেমন আছেন? পদ্ধতির ভিতরে, আমরা সমস্ত আর্গুমেন্টের উপর পুনরাবৃত্তি করি এবং নাম সহ ফরম্যাট করা বাক্যাংশগুলি প্রদর্শন করি। এখানে আমরা একটি সরলীকৃত for-each
লুপ ব্যবহার করি (যা আপনি আগে দেখেছেন)। এটি এখানে নিখুঁত, কারণ ( স্ট্রিং... নাম ) স্বরলিপির প্রকৃত অর্থ হল যে কম্পাইলার সমস্ত পাস করা আর্গুমেন্টকে একটি অ্যারেতে রাখে। ফলস্বরূপ, আমরা পরিবর্তনশীল নাম নিয়ে কাজ করতে পারিযেমন আমরা একটি অ্যারের সাথে কাজ করব, লুপে এটির মাধ্যমে পুনরাবৃত্তি সহ। প্লাস, এটি পাস করা স্ট্রিংগুলির যেকোনো সংখ্যার সাথে কাজ করবে! দুই, দশ, এমনকি এক হাজার—যেকোন সংখ্যক অতিথির সাথে পদ্ধতিটি সঠিকভাবে কাজ করবে। সমস্ত সম্ভাবনার জন্য পদ্ধতিটি ওভারলোড করার চেয়ে আরও সুবিধাজনক, আপনি কি মনে করেন না? :) এখানে ওভারলোডিং পদ্ধতির আরেকটি উদাহরণ। printInfoFromDatabase()
জার্ভিসকে একটা পদ্ধতি দেওয়া যাক । এটি একটি ডাটাবেস থেকে একজন ব্যক্তির সম্পর্কে তথ্য প্রদর্শন করবে। যদি ডাটাবেস নির্দেশ করে যে একজন ব্যক্তি সুপারহিরো বা সুপারভিলেন, আমরা সেই তথ্য প্রদর্শন করব:
public class Jarvis {
public void printInfoFromDatabase (String bio) {
System.out.println(bio);
}
public void printInfoFromDatabase(String bio, boolean isEvil, String nickname) {
System.out.println(bio);
if (!isEvil) {
System.out.println("Also known as the superhero " + nickname);
} else {
System.out.println("Also known as the supervillain " + nickname);
}
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.printInfoFromDatabase("Laura Palmer. Date of birth: July 22, 1972. Twin Peaks, Washington");
System.out.println();
jarvis.printInfoFromDatabase("Max Eisenhardt. Height: 15.6 ft. Weight: 189 lbs. ", true, "Magneto");
}
}
আউটপুট: লরা পামার। জন্ম তারিখ: 22 জুলাই, 1972। টুইন পিকস, ওয়াশিংটন ম্যাক্স আইজেনহার্ড। উচ্চতা: 15.6 ফুট। ওজন: 189 পাউন্ড। সুপারভিলেন ম্যাগনেটো নামেও পরিচিত তাই, আমাদের পদ্ধতির আচরণ নির্ভর করে আমরা এটিতে যে ডেটা দিয়ে থাকি তার উপর। এখানে আরেকটি গুরুত্বপূর্ণ বিষয়: আর্গুমেন্টের ক্রম গুরুত্বপূর্ণ! ধরা যাক আমাদের পদ্ধতিটি একটি স্ট্রিং এবং একটি সংখ্যা নেয়:
public class Person {
public static void sayYourAge(String greeting, int age) {
System.out.println(greeting + " " + age);
}
public static void main(String[] args) {
sayYourAge("My age is ", 33);
sayYourAge(33, "My age is "); // Error!
}
}
যদি Person
ক্লাসের sayYourAge()
পদ্ধতিটি ইনপুট হিসাবে একটি স্ট্রিং এবং একটি সংখ্যা নেয়, তাহলে এই আর্গুমেন্টগুলিকে অবশ্যই পদ্ধতিতে পাস করতে হবে! যদি আমরা তাদের একটি ভিন্ন ক্রমে পাস করি, তাহলে কম্পাইলার একটি ত্রুটি তৈরি করবে এবং ব্যক্তি তার বয়স বলতে সক্ষম হবে না। যাইহোক, কনস্ট্রাক্টর, যা আমরা শেষ পাঠে কভার করেছি, এটিও পদ্ধতি! আপনি সেগুলিকে ওভারলোড করতে পারেন (যেমন প্যারামিটারের বিভিন্ন সেট সহ বেশ কয়েকটি কনস্ট্রাক্টর তৈরি করুন) এবং পাস করা আর্গুমেন্টের ক্রম তাদের জন্যও মৌলিকভাবে গুরুত্বপূর্ণ। তারা বাস্তব পদ্ধতি! :)
অনুরূপ পরামিতি সহ পদ্ধতিগুলি কীভাবে আহ্বান করবেন
আপনি জানেন,null
জাভা একটি কীওয়ার্ড. এটা বোঝা খুব গুরুত্বপূর্ণ যে null
এটি একটি বস্তু বা ডেটা টাইপ নয় । কল্পনা করুন যে আমাদের একটি Person
শ্রেণী এবং একটি introduce()
পদ্ধতি আছে, যা ব্যক্তির নাম এবং বয়স ঘোষণা করে। উপরন্তু, বয়স পাঠ্য বা একটি সংখ্যা হিসাবে পাস করা যেতে পারে.
public class Person {
public void introduce(String name, String age) {
System.out.println("My name is " + name + ". My age is " + age);
}
public void introduce(String name, Integer age) {
System.out.println("My name is " + name + ". My age is " + age);
}
public static void main(String[] args) {
Person alex = new Person();
alex.introduce ("Alex", "twenty-one");
Person mary = new Person();
mary.introduce("Mary", 32);
}
}
আমরা ইতিমধ্যেই ওভারলোডিংয়ের সাথে পরিচিত, তাই আমরা জানি যে উভয় পদ্ধতিই তাদের উচিত আচরণ করবে: আমার নাম অ্যালেক্স। আমার বয়স একুশ বছর আমার নাম মেরি। আমার বয়স 32null
কিন্তু আমরা যদি স্ট্রিং বা সংখ্যার পরিবর্তে দ্বিতীয় প্যারামিটার হিসাবে পাস করি তবে কী হবে ?
public static void main(String[] args) {
Person victor = new Person();
victor.introduce("Victor", null);// Ambiguous method call!
}
আমরা একটি সংকলন ত্রুটি পেতে হবে! এর কারণ কী এবং "অস্পষ্টতা" ঠিক কী? আসলে, এটা সব খুব সহজ. সমস্যা হল আমাদের পদ্ধতির দুটি সংস্করণ রয়েছে: একটি String
দ্বিতীয় যুক্তি হিসাবে একটি সহ এবং একটি Integer
দ্বিতীয় যুক্তি হিসাবে। কিন্তু a String
এবং an Integer
দুটোই হতে পারে null
! কারণ তারা রেফারেন্স প্রকার, null
তাদের উভয়ের জন্য ডিফল্ট মান। এই কারণেই এই পরিস্থিতিতে কম্পাইলারটি পদ্ধতির কোন সংস্করণটি কল করা উচিত তা বের করতে পারে না। এই সমস্যার সমাধান বেশ সহজ। Null
স্পষ্টভাবে একটি নির্দিষ্ট রেফারেন্স টাইপ রূপান্তর করা যেতে পারে. এইভাবে, আপনি যখন একটি পদ্ধতি কল করেন, আপনি দ্বিতীয় আর্গুমেন্টের জন্য আপনি যে ডেটা টাইপ চান তা বন্ধনীতে নির্দেশ করতে পারেন! কম্পাইলার আপনার "ইঙ্গিত" বুঝতে পারবে এবং সঠিক পদ্ধতিতে কল করবে:
public class Person {
public void introduce(String name, String age) {
System.out.println("Method with two strings!");
System.out.println("My name is " + name + ". My age is " + age);
}
public void introduce(String name, Integer age) {
System.out.println("Method with a string and a number!");
System.out.println("My name is " + name + ". My age is " + age);
}
public static void main(String[] args) {
Person victor = new Person();
victor.introduce("Victor", (String) null);
}
}
আউটপুট: দুটি স্ট্রিং সহ পদ্ধতি! আমার নাম ভিক্টর। আমার বয়স শূন্য দ্রষ্টব্য যে যদি সংখ্যার প্যারামিটারটি int
পূর্ণসংখ্যার রেফারেন্স টাইপের একটি উদাহরণের পরিবর্তে একটি আদিম হতো, তাহলে এমন একটি ত্রুটি থাকত না।
public class Person {
public void introduce(String name, String age) {
System.out.println("Method with two strings!");
System.out.println("My name is " + name + ". My age is " + age);
}
public void introduce(String name, int age) {
System.out.println("Method with a string and a number!!");
System.out.println("My name is " + name + ". My age is " + age);
}
public static void main(String[] args) {
Person victor = new Person();
victor.introduce("Victor", null);
}
}
আপনি অনুমান করতে পারেন কেন? আপনি যদি অনুমান করেন কেন, ভাল কাজ! :) আদিম হতে পারে না কারণ null
. এখন কম্পাইলারের শুধুমাত্র একটি পছন্দ আছে, অর্থাৎ introduce()
দুটি স্ট্রিং দিয়ে মেথড কল করা। এটি পদ্ধতির সংস্করণ যা প্রতিবার পদ্ধতিটি কল করার সময় চলবে।
আরো পড়া: |
---|
GO TO FULL VERSION