আমি সবসময় মধ্যে বিভ্রান্ত করছি staticএবং finalকিওয়ার্ড মধ্যে জাভা ।
কিভাবে তারা ব্যতিক্রম ?
আমি সবসময় মধ্যে বিভ্রান্ত করছি staticএবং finalকিওয়ার্ড মধ্যে জাভা ।
কিভাবে তারা ব্যতিক্রম ?
উত্তর:
প্রথমে স্ট্যাটিক ভেরিয়েবল এবং স্থির পদ্ধতিগুলি দেখুন।
Class.variableClass.methodName() thisবা superকীওয়ার্ডগুলি উল্লেখ করতে পারে না ।জাভাতেও "স্ট্যাটিক নেস্টেড ক্লাস" রয়েছে। একটি স্ট্যাটিক নেস্টেড ক্লাসটি কেবলমাত্র একটি যা স্পষ্টভাবে বাইরের শ্রেণীর উদাহরণের সাথে উল্লেখ করে না।
স্ট্যাটিক নেস্টেড ক্লাসে উদাহরণ পদ্ধতি এবং স্থির পদ্ধতি থাকতে পারে।
জাভাতে কোনও শীর্ষ-স্তরের স্ট্যাটিক শ্রেণির মতো জিনিস নেই।
মূল পদ্ধতিটি হ'ল
staticযেহেতু কোনও ইনস্ট্যান্টেশন হওয়ার আগে কোনও অ্যাপ্লিকেশন চালানোর জন্য এটি অবশ্যই অ্যাক্সেসযোগ্য হতে হবে।
final কীওয়ার্ডটি কোনও সত্ত্বাকে সংজ্ঞায়িত করতে বিভিন্ন পৃথক প্রসঙ্গে ব্যবহার করা হয় যা পরে পরিবর্তন করা যায় না।একটি finalশ্রেণি সাবক্ল্যাস করা যাবে না। এটি সুরক্ষা এবং দক্ষতার কারণে করা হয়। তদনুসারে, জাভা স্ট্যান্ডার্ড লাইব্রেরি ক্লাসগুলির অনেকগুলি finalউদাহরণস্বরূপ java.lang.Systemএবং java.lang.String। একটি finalশ্রেণীর সমস্ত পদ্ধতি নিখুঁতভাবে হয় final।
একটি finalপদ্ধতি সাবক্লাস দ্বারা ওভাররাইড করা যায় না। এটি ক্লাসের ক্রিয়া বা ধারাবাহিকতার জন্য গুরুত্বপূর্ণ হতে পারে এমন একটি পদ্ধতিতে পরিবর্তিত সাবক্লাস থেকে অপ্রত্যাশিত আচরণ রোধ করতে ব্যবহৃত হয়।
একটি finalভেরিয়েবল কেবল একবার ইনিশিয়ালাইজার বা অ্যাসাইনমেন্ট স্টেটমেন্টের মাধ্যমে একবারে আরম্ভ করা যেতে পারে। এটি ঘোষণার স্থানে আরম্ভ করার দরকার নেই: এটিকে blank finalপরিবর্তনশীল বলা হয়। কোনও শ্রেণীর একটি ফাঁকা চূড়ান্ত উদাহরণ পরিবর্তনশীল অবশ্যই শ্রেণীর যে কোনও নির্মাতার এটি ঘোষণা করা হয়েছে তার শেষে অবশ্যই নির্ধারিত হবে; একইভাবে, একটি ফাঁকা চূড়ান্ত স্ট্যাটিক ভেরিয়েবল অবশ্যই শ্রেণীর স্ট্যাটিক ইনিশিয়ালাইজারে অবশ্যই নির্ধারিত হতে হবে যেখানে এটি ঘোষণা করা হয়েছে; অন্যথায়, উভয় ক্ষেত্রেই একটি সংকলন-সময় ত্রুটি ঘটে।
যখন কোনও বেনামে অভ্যন্তরীণ শ্রেণিটি কোনও পদ্ধতির শরীরে সংজ্ঞায়িত করা হয়, finalতখন সেই পদ্ধতির সুযোগে ঘোষিত সমস্ত পরিবর্তনগুলি অভ্যন্তরীণ শ্রেণীর মধ্যে থেকে অ্যাক্সেসযোগ্য। একবার এটি নির্ধারিত হয়ে গেলে, চূড়ান্ত ভেরিয়েবলের মান পরিবর্তন করা যায় না।
Class.methodName()
স্থির অর্থ এটি শ্রেণীর অন্তর্গত, উদাহরণ হিসাবে নয়, এর অর্থ একটি নির্দিষ্ট শ্রেণীর সমস্ত দৃষ্টান্তের মধ্যে ভাগ করে নেওয়া সেই পরিবর্তনশীল / পদ্ধতির কেবল একটি অনুলিপি রয়েছে ।
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
চূড়ান্তটি সম্পূর্ণরূপে সম্পর্কিত নয়, এটি একবারে কেবলমাত্র আরম্ভের সংজ্ঞা দেওয়ার একটি উপায়। আপনি ভেরিয়েবল সংজ্ঞায়িত করার সময় বা কনস্ট্রাক্টরের অভ্যন্তরে আর কোথাও আরম্ভ করতে পারবেন।
নোট চূড়ান্ত পদ্ধতি এবং চূড়ান্ত শ্রেণীর উপর একটি নোট, এটি স্পষ্টভাবে উল্লেখ করার একটি উপায় যা পদ্ধতি বা শ্রেণি যথাক্রমে ওভাররাইড / বাড়ানো যাবে না।
স্টাটিকের বিষয়ে অতিরিক্ত পঠন তাই আমরা এর অন্যান্য ব্যবহারগুলি সম্পর্কে বলছিলাম, এটি কখনও কখনও স্থির ব্লকে ব্যবহৃত হয়। স্ট্যাটিক ভেরিয়েবল ব্যবহার করার সময় ক্লাসটি ব্যবহারের আগে মাঝে মাঝে এই ভেরিয়েবলগুলি সেট আপ করা প্রয়োজন তবে দুর্ভাগ্যক্রমে আপনি কোনও কনস্ট্রাক্টর পাবেন না। এই স্থির কীওয়ার্ডটি এখানে আসে।
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
আপনি এই ব্লক সূচনাকারী উদাহরণস্বরূপ যা কন্সট্রাকটর আগে বলা হয় সঙ্গে গুলিয়ে ফেলা পেতে হবে প্রতি উদাহরণস্বরূপ।
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
দুটি সত্যিই এক নয়। staticক্ষেত্রগুলি এমন ক্ষেত্র যা শ্রেণীর কোনও নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত নয় ।
class C {
public static int n = 42;
}
এখানে staticক্ষেত্রটি nকোনও নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত Cনয় তবে সাধারণভাবে পুরো শ্রেণীর সাথে (যার কারণে C.nএটি অ্যাক্সেস করতে ব্যবহার করা যেতে পারে)। আপনি এখনও Cঅ্যাক্সেস একটি উদাহরণ ব্যবহার করতে পারেন n? হ্যাঁ - তবে এটি বিশেষভাবে অনুশীলন হিসাবে বিবেচিত হয় না।
final অন্যদিকে ইঙ্গিত দেয় যে কোনও নির্দিষ্ট পরিবর্তনশীল এটি আরম্ভ করার পরে পরিবর্তন করতে পারে না।
class C {
public final int n = 42;
}
এখানে, nপুনরায় বরাদ্দ করা যাবে না কারণ এটি final। আর একটি পার্থক্য হ'ল যে কোনও ভেরিয়েবল ঘোষিত হতে পারে final, তবে প্রতিটি ভেরিয়েবল স্থির হিসাবে ঘোষণা করা যায় না।
এছাড়াও, ক্লাসগুলি ঘোষণা করা যেতে পারে finalযা ইঙ্গিত করে যে তাদের বাড়ানো যাবে না:
final class C {}
class B extends C {} // error!
একইভাবে, পদ্ধতিগুলি চূড়ান্ত হিসাবে ঘোষিত করা যেতে পারে যেগুলি নির্দেশ করে যে এগুলি একটি বর্ধিত শ্রেণীর দ্বারা ওভাররাইড করা যাবে না :
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
publicশ্রেণি যা ফাইল সংজ্ঞা দেয়) বা staticঅভ্যন্তরীণ ক্লাসগুলি staticভেরিয়েবল সংজ্ঞায়িত করতে পারে । অন্যান্য অভ্যন্তর শ্রেণিগুলি বাইরের শ্রেণীর উদাহরণ এবং স্থির ভেরিয়েবল থাকতে পারে না।
চূড়ান্ত -
1) যখন আমরা একটি ভেরিয়েবলের উপর " চূড়ান্ত " কীওয়ার্ডটি প্রয়োগ করি তখন সেই ভেরিয়েবলের মান স্থির থাকে। (বা) একবার আমরা কোনও পরিবর্তনকে চূড়ান্ত হিসাবে ঘোষণা করি that সেই ভেরিয়েবলের মান পরিবর্তন করা যায় না।
2) এটি কার্যকর হয় যখন কোনও প্রোগ্রামের জীবনকালীন সময়ে একটি ভেরিয়েবলের মান পরিবর্তন হয় না
স্থির -
1) যখন আমরা "প্রয়োগ স্ট্যাটিক একটি থেকে" শব্দ পরিবর্তনশীল , এটা বর্গ জন্যে মানে।
২) যখন আমরা কোনও পদ্ধতিতে " স্ট্যাটিক " কীওয়ার্ড প্রয়োগ করি , তার অর্থ ক্লাসের কোনও উদাহরণ তৈরি না করেই পদ্ধতিটি অ্যাক্সেস করা যায় means
static মানে শ্রেণীর সমস্ত দৃষ্টান্তের দ্বারা ভাগ করা মেমরিতে ভেরিয়েবলের কেবল একটি অনুলিপি রয়েছে।
finalশব্দ মাত্র মান পরিবর্তন করা যাবে না মানে। ছাড়া final, কোনও বস্তু ভেরিয়েবলের মান পরিবর্তন করতে পারে।
স্থির এবং চূড়ান্ত কিছু বড় পার্থক্য আছে:
স্ট্যাটিক ভেরিয়েবল বা ক্লাসগুলি সর্বদা যে কোনও জায়গা থেকে (প্রায় বেশ) থেকে উপলব্ধ থাকবে। ফাইনাল হ'ল একটি কীওয়ার্ড যার অর্থ একটি ভেরিয়েবল পরিবর্তন করা যায় না। সুতরাং যদি:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
প্রোগ্রামটি "প্রথম" পূর্ণসংখ্যা পরিবর্তন করার চেষ্টা না করা পর্যন্ত চলতে থাকবে, যার ফলে একটি ত্রুটি ঘটবে। এই শ্রেণীর বাইরে, আপনি যদি ক্লাসটি ইনস্ট্যান্ট করে থাকেন তবে কেবলমাত্র "প্রথম" পরিবর্তনশীলটিতে অ্যাক্সেস পাবেন। এটি "সেকেন্ড" এর বিপরীতে, যা সর্বদা উপলব্ধ।
স্পিকারের মতো কোনও বিষয় ভাবুন। স্পিকার যদি শ্রেণি হয় তবে এর বিভিন্ন ভেরিয়েবল যেমন ভলিউম, ট্রিবল, খাদ, রঙ ইত্যাদি থাকবে আপনি স্পিকার শ্রেণীর সংজ্ঞা দেওয়ার সময় এই সমস্ত ক্ষেত্রগুলি সংজ্ঞায়িত করেন। উদাহরণস্বরূপ, আপনি স্ট্যাটিক মডিফায়ার সহ রঙের ক্ষেত্রটি ঘোষণা করেছিলেন, এর অর্থ আপনি সংকলককে বলছেন যে ক্লাসটি যতবার তত্ক্ষণিত হয়েছে তা নির্বিশেষে অস্তিত্বের এই পরিবর্তনশীলটির ঠিক একটি অনুলিপি রয়েছে।
প্রকাশক
static final String color = "Black";
এটি নিশ্চিত করবে যে যখনই এই শ্রেণিটি তাত্ক্ষণিকভাবে চালু করা হবে, রঙের ক্ষেত্রের মান এটি "কালো" হবে যদি না এটি পরিবর্তন না করা হয়।
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
দ্রষ্টব্য: এখন একবার আপনি স্পিকারের রঙটি চূড়ান্ত হিসাবে পরিবর্তন করলে এই কোডটি কার্যকর হবে না, কারণ চূড়ান্ত কীওয়ার্ডটি নিশ্চিত করে যে ক্ষেত্রের মান কখনই পরিবর্তন হয় না।
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
আপনি আপনার এমুলেটরটিতে সরাসরি এই কোডটি অনুলিপি / পেস্ট করতে পারেন এবং চেষ্টা করতে পারেন।
সহজ পার্থক্য,
চূড়ান্ত : এর অর্থ হল ভেরিয়েবলের মান চূড়ান্ত এবং এটি কোথাও পরিবর্তন হবে না। যদি আপনি বলে থাকেন যে চূড়ান্ত এক্স = 5 এর অর্থ হল x পরিবর্তন করা যায় না তবে এর মান সবার জন্য চূড়ান্ত।
স্থির: এর অর্থ এটির একটিমাত্র অবজেক্ট রয়েছে। ধরা যাক আপনার কাছে x = 5 রয়েছে, মেমোরিতে x = 5 রয়েছে এবং এটি একটি শ্রেণীর ভিতরে রয়েছে। আপনি যদি শ্রেণীর কোনও অবজেক্ট বা উদাহরণ তৈরি করেন যার অর্থ সেখানে একটি নির্দিষ্ট বাক্স যা সেই শ্রেণি এবং তার ভেরিয়েবল এবং পদ্ধতিগুলি উপস্থাপন করে। এবং আপনি যদি সেই শ্রেণীর অন্য কোনও অবজেক্ট বা দৃষ্টান্ত তৈরি করেন তবে এর অর্থ that একই শ্রেণীর দুটি বাক্স রয়েছে যার মেমোরিতে তাদের ভিতরে বিভিন্ন এক্স রয়েছে। এবং যদি আপনি উভয় এক্সকে বিভিন্ন অবস্থানে কল করে এবং তাদের মান পরিবর্তন করেন তবে তাদের মান আলাদা হবে। বাক্স 1-এ x রয়েছে যার x = 5 রয়েছে এবং বাক্স 2-তে x = 6. রয়েছে তবে আপনি যদি x টি স্ট্যাটিক করেন তবে এর অর্থ এটি আবার তৈরি করা যাবে না। আপনি শ্রেণীর অবজেক্ট তৈরি করতে পারেন তবে সেই বস্তুর মধ্যে আলাদা আলাদা এক্স থাকবে না। x যদি স্থির হয় তবে বাক্স 1 এবং বাক্স 2 উভয়ের ক্ষেত্রে একই x থাকবে যার মান 5 হবে 5 হ্যাঁ আমি স্থির মানটিকে যে কোনও জায়গায় চূড়ান্ত হিসাবে পরিবর্তন করতে পারি। সুতরাং যদি আমি বলি যে বাক্স 1 এর এক্স রয়েছে এবং আমি এর মানটি x = 5 তে পরিবর্তন করি এবং এর পরে আমি অন্য বাক্স তৈরি করি যা বক্স 2 হয় এবং আমি বাক্স 2 এক্স এর মানকে x = 6 এ পরিবর্তন করি। তারপরে এক্স হিসাবে স্থির হয় উভয় বাক্সে একই x থাকে। এবং দুটি বাক্সই বাক্সের মান 6 হিসাবে দেবে কারণ বাক্স 2 5 থেকে 6 এর মান ওভাররাইট করে।
চূড়ান্ত এবং স্থির উভয়ই সম্পূর্ণ আলাদা। ফাইনাল যা চূড়ান্ত তা পরিবর্তন করা যায় না। স্থিতিশীল যা এক হিসাবে থাকবে তবে পরিবর্তিত হতে পারে।
"এটি একটি উদাহরণ। স্মরণ করুন স্থির পরিবর্তনশীল সর্বদা তাদের শ্রেণীর নাম দ্বারা ডাকা হয় because কারণ that শ্রেণীর সমস্ত বস্তুর জন্য তারা কেবল একটি only সুতরাং ক্লাস এ এর x = 5 রয়েছে, আমি এ্যাক্স = 6 দ্বারা কল করে এটি পরিবর্তন করতে পারি; "
স্ট্যাটিক এমন একটি জিনিস যা শ্রেণীর যে কোনও বস্তু কল করতে পারে, যা অন্তর্নিহিতভাবে কোনও অবজেক্টের ধরণের।
একটি ভেরিয়েবল সম্পূর্ণ শ্রেণীর জন্য চূড়ান্ত হতে পারে এবং এর সহজ অর্থ এটি আর পরিবর্তন করা যায় না। এটি কেবল একবার সেট করা যেতে পারে এবং এটি আবার সেট করার চেষ্টা করার ফলে একটি ত্রুটি নিক্ষেপ হবে in এটি বেশ কয়েকটি কারণে কার্যকর, সম্ভবত আপনি একটি ধ্রুবক ঘোষণা করতে চান, এটি পরিবর্তন করা যায় না।
কিছু উদাহরণ কোড:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
উইকিপিডিয়ায় জাভা কীওয়ার্ডগুলির সম্পূর্ণ তালিকা রয়েছে ।
আমি এখানে একটি সম্পূর্ণ উত্তর দেওয়ার চেষ্টা করব না। আমার সুপারিশটি হ'ল তাদের প্রত্যেকে কী করে তা বোঝার জন্য ফোকাস করা এবং তারপরে এটি পরিষ্কার হওয়া উচিত যে তাদের প্রভাবগুলি সম্পূর্ণ আলাদা এবং কেন কখনও কখনও সেগুলি একসাথে ব্যবহৃত হয়।
staticএটি কোনও শ্রেণীর (বৈশিষ্ট্য এবং পদ্ধতি) সদস্যদের জন্য এবং এটি উদাহরণ (অ স্থির) সদস্যের বিপরীতে বুঝতে হবে। আমি জাভা টিউটোরিয়ালগুলিতে "বোঝার উদাহরণ এবং ক্লাস সদস্য" পড়ার পরামর্শ দেব । আমি staticব্লকগুলিতেও ব্যবহার করতে পারি তবে আমি এটি শুরু করার জন্য চিন্তা করব না।
finalএটি ভেরিয়েবল, পদ্ধতি, ক্লাস বা অন্য কোনও ক্ষেত্রে প্রয়োগ করা হয় তার ভিন্ন ভিন্ন অর্থ রয়েছে। এখানে আমি উইকিপিডিয়া ব্যাখ্যা আরও ভাল পছন্দ করি ।
স্থিতিশীল ভেরিয়েবল মানগুলি প্রয়োগের মাধ্যমে পরিবর্তনশীল ট্র্যাভার্সের একটি অনুলিপি পরিবর্তিত হতে পারে, যেখানে চূড়ান্ত পরিবর্তনশীল মানগুলি একবার আরম্ভ করা যায় এবং পুরো অ্যাপ্লিকেশন জুড়ে পরিবর্তন করা যায় না।