JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ فائنل، مستقل ۽ ناقابل قبول

جاوا ۾ فائنل، مستقل ۽ ناقابل قبول

گروپ ۾ شايع ٿيل
سلام! لفظ "موڊيفائر" توهان کي اڳ ۾ ئي واقف آهي. گهٽ ۾ گهٽ، توهان وٽ پهچي چڪا آهيو رسائي موڊيفائر (عوامي، خانگي) ۽ جامد تبديل ڪندڙ. اڄ اسان خاص فائنل موڊيفائر بابت ڳالهائينداسين . اهو چئي سگهجي ٿو "سيمينٽ" اسان جي پروگرام جي انهن علائقن ۾ جتي اسان کي مسلسل، غير واضح، غير تبديل ٿيندڙ رويي جي ضرورت آهي. اهو اسان جي پروگرام جي ٽن علائقن ۾ استعمال ڪري سگهجي ٿو: ڪلاس، طريقا ۽ متغير. جاوا ۾ اڻ بدليل: آخري، مستقل ۽ غير بدليل - 2 اچو ته انهن مان هڪ هڪ ذريعي وڃو. جيڪڏهن هڪ طبقي جي اعلان ۾ حتمي ترميم ڪندڙ شامل آهي ، ان جو مطلب اهو آهي ته توهان هن طبقي مان ورثي ۾ نه ٿا سگهو. پوئين ليڪچرن ۾، اسان وراثت جو ھڪڙو سادو مثال ڏٺو: اسان وٽ ھڪڙو والدين ڪلاس ھو Animal، ۽ ٻه ٻار طبقا - Cat۽Dog
public class Animal {
}

public class Cat extends Animal {
   //..поля и методы класса Cat
}

public class Dog extends Animal {

   //..поля и методы класса Dog
}
تنهن هوندي، جيڪڏهن اسان هڪ طبقي لاءِ Animalهڪ ترميمي جي وضاحت ڪريون ٿا، ته طبقن ان مان ورثي ۾ به finalنه ٿي سگهندا . CatDog
public final class Animal {

}

public class Cat extends Animal {

   //ошибка! Cannot inherit from final Animal
}
مرتب ڪندڙ فوري طور تي هڪ غلطي پيدا ڪري ٿو. جاوا ۾ اڳ ۾ ئي ڪيترائي ڪلاس لاڳو ڪيا ويا آھن final. انهن مان سڀ کان وڌيڪ مشهور آهي جيڪي توهان مسلسل استعمال ڪندا آهيو String. اضافي طور تي، جيڪڏهن هڪ طبقي کي قرار ڏنو ويو آهي final، ان جا سڀئي طريقا پڻ بڻجي ويندا آهن final. هن جو ڇا مطلب آهي؟ جيڪڏهن هڪ موڊيفائر هڪ طريقي لاءِ مخصوص ڪيو ويو آهي final، اهو طريقو ختم نٿو ڪري سگهجي. مثال طور، اسان وٽ ھڪڙو طبقو آھي Animalجيڪو ھڪڙو طريقو بيان ڪري ٿو voice(). بهرحال، ڪتا ۽ ٻليون واضح طور تي "ڳالهائڻ" مختلف طور تي. تنهن ڪري، هر هڪ طبقي ۾ - Cat۽ Dog- اسان هڪ طريقو ٺاهينداسين voice()، پر اسان ان کي مختلف طريقي سان لاڳو ڪنداسين.
public class Animal {

   public void voice() {
       System.out.println("Voice!");
   }
}

public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void voice() {
       System.out.println("Woof!");
   }
}
ڪلاس ۾ Cat۽ Dogاسان والدين طبقي جي طريقي کي ختم ڪري ڇڏيو آهي. هاڻي جانور آواز ڪندو ان تي منحصر آهي ته اهو ڪهڙي طبقي جو اعتراض آهي:
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       Dog dog = new Dog();

       cat.voice();
       dog.voice();
   }
}
نتيجو: ميوو! ووف! تنهن هوندي، جيڪڏهن Animalاسان هڪ طبقي ۾ هڪ طريقي جو اعلان ڪريون ٿا voice()ته final، اهو ممڪن نه ٿيندو ته ان کي ٻين طبقن ۾ ٻيهر بيان ڪرڻ:
public class Animal {

   public final void voice() {
       System.out.println("Voice!");
   }
}


public class Cat extends Animal {

   @Override
   public void voice() {//ошибка! final-метод не может быть переопределен!
       System.out.println("Meow!");
   }
}
پوءِ اسان جون شيون ان طريقي کي استعمال ڪرڻ تي مجبور ٿي وينديون voice()جيئن ان کي والدين طبقي ۾ بيان ڪيو ويو آهي:
public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   cat.voice();
   dog.voice();
}
نتيجو: آواز! آواز! هاڻي جي باري ۾ final-variables. ٻي صورت ۾ انهن کي مسلسل سڏيو ويندو آهي . پهريون (۽ سڀ کان وڌيڪ اهم)، پهريون قدر جيڪو مسلسل مقرر ڪيو ويو آهي تبديل نٿو ڪري سگهجي. اهو هڪ ڀيرو ۽ هميشه لاء مقرر ڪيو ويو آهي.
public class Main {

   private static final int CONSTANT_EXAMPLE = 333;

   public static void main(String[] args) {

       CONSTANT_EXAMPLE = 999;//ошибка! Нельзя присвоить новое meaning final-переменной!
   }
}
مستقل کي فوري طور تي شروع ڪرڻ جي ضرورت ناهي. اهو بعد ۾ ڪري سگهجي ٿو. پر پهرين مقرر ڪيل قيمت هميشه لاءِ رهندي.
public static void main(String[] args) {

   final int CONSTANT_EXAMPLE;

   CONSTANT_EXAMPLE = 999;//так делать можно
}
ٻيو، اسان جي متغير جي نالي تي ڌيان ڏيو. جاوا ڪنسٽنٽن وٽ مختلف نالا ڪنوينشن آھن. هي اهو اٺ نه آهي جنهن جا اسان استعمال ڪيا ويا آهيون. باقاعده متغير جي صورت ۾، اسان ان کي سڏينداسين مستقل مثال، پر مستقل جا نالا ڪيپ ۾ لکيل آهن، ۽ لفظن جي وچ ۾ (جيڪڏهن انهن مان ڪيترائي آهن) اتي هڪ انڊر اسڪور آهي - "CONSTANT_EXAMPLE". مسلسل ڇو ضروري آهن؟ مثال طور، اهي هٿ ۾ ايندا جيڪڏهن توهان مسلسل پروگرام ۾ ڪجهه مسلسل قيمت استعمال ڪندا آهيو. اچو ته چئو ته توھان تاريخ ۾ ھيٺ وڃڻ جو فيصلو ڪيو ۽ راند کي ”دي ويچر 4“ اڪيلو لکڻ. راند واضح طور تي بنيادي ڪردار جو نالو استعمال ڪندي - "Geralt of Rivia". اهو بهتر آهي ته هن لائين ۽ ٻين هيروز جي نالن کي مستقل طور تي الڳ ڪريو: جيڪا قيمت توهان کي گهربل هجي اها هڪ جاءِ تي محفوظ ڪئي ويندي، ۽ توهان يقيناً غلطي نه ڪندا جڏهن ان کي لکين ڀيرا ٽائپ ڪندا.
public class TheWitcher4 {

   private static final String GERALT_NAME = "Геральт из Ривии";
   private static final String YENNEFER_NAME = "Йеннифэр из Венгерберга";
   private static final String TRISS_NAME = "Трисс Меригольд";

   public static void main(String[] args) {

       System.out.println("Ведьмак 4");
       System.out.println("Это уже четвертая часть Ведьмака, а " + GERALT_NAME + " ниHow не определится кто ему" +
               " нравится больше: " + YENNEFER_NAME + " or " + TRISS_NAME);

       System.out.println("Но если вы никогда не играли в Ведьмака - начнем сначала.");
       System.out.println("Главного героя зовут " + GERALT_NAME);
       System.out.println(GERALT_NAME + " - ведьмак, охотник на чудовищ");
   }
}
نتيجو:
Ведьмак 4
Это уже четвертая часть Ведьмака, а Геральт из Ривии ниHow не определится, кто ему нравится больше: Йеннифэр из Венгерберга or Трисс Меригольд.
Но если вы никогда не играли в Ведьмака — начнем сначала.
Главного героя зовут Геральт из Ривии
Геральт из Ривии — ведьмак, охотник на чудовищ
اسان ڪردارن جي نالن کي مستقل ۾ ورهائي ڇڏيو آهي، ۽ هاڻي اسان انهن کي يقيني طور تي غلط اکر نه ڪنداسين، ۽ هر وقت انهن کي هٿ سان لکڻ جي ضرورت ناهي. ٻيو پلس: جيڪڏهن اسان آخرڪار پروگرام ۾ هڪ متغير جي قيمت کي تبديل ڪرڻ جي ضرورت آهي، اهو هڪ جاء تي ڪرڻ ڪافي آهي، بجاء دستي طور تي سڄي ڪوڊ ۾ ٻيهر ڪرڻ جي بدران :)

ناقابل بدلائي قسمون

توهان جي جاوا ۾ ڪم ڪرڻ دوران، توهان شايد اڳ ۾ ئي حقيقت جي عادي ٿي چڪا آهيو ته پروگرامر تقريبا مڪمل طور تي سڀني شين جي حالت کي سنڀاليندو آهي. مطلوب - هڪ اعتراض پيدا ڪيو Cat. جيڪڏهن مون چاهيو ته، مون ان جو نالو مٽايو. جيڪڏهن هن چاهيو ته، هن پنهنجي عمر، يا ٻيو ڪجهه تبديل ڪيو. پر جاوا ۾ ڪيترائي ڊيٽا جا قسم آھن جن جي ھڪڙي خاص حالت آھي. اُهي غير بدلائيندڙ آهن ، يا اَڻ مٽائيندڙ . ان جو مطلب اهو آهي ته جيڪڏهن ڪو طبقو بدلجندڙ آهي، ته ان جي شين جي حالت تبديل نه ٿي سگهي. مثال؟ توھان کي حيرت ٿي سگھي ٿي، پر Immutable طبقي جو سڀ کان مشهور مثال آھي String! اهو لڳي ٿو ته اسان هڪ تار جي قيمت تبديل نٿا ڪري سگهون؟ اچو ڪوشش ڪريون:
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1 = "I love Python";//но поведение str1 ниHow не влияет на str2
   System.out.println(str2);//str2 продолжает указывать на строку "I love Java", хотя str1 уже указывает на другой an object
}
نتيجو: مان جاوا سان پيار ڪريان ٿو مون کي جاوا پسند آهي ان کان پوءِ اسان لکيو:
str1 = "I love Python";
"I love Java" واري اسٽرنگ سان اعتراض تبديل نه ٿيو آهي ۽ ڪٿي به نه ويو آهي. اهو محفوظ طور تي موجود آهي ۽ ان جي اندر بلڪل ساڳيو متن آهي جيئن اڳ. ڪوڊ:
str1 = "I love Python";
صرف هڪ ٻيو اعتراض ٺاهيو ۽ هاڻي متغير str1ان ڏانهن اشارو ڪيو. پر اسان ڪنهن به طريقي سان "مون کي جاوا پيار" اعتراض تي اثر انداز نٿا ڪري سگهون. چڱو، اچو ته ان کي مختلف طور تي ڪوشش ڪريو! ڪلاس Stringطريقن سان ڀريل آهي، ۽ انهن مان ڪجهه قطار جي حالت کي تبديل ڪرڻ لڳي ٿو! مثال طور، اتي هڪ طريقو آهي replace(). اچو ته لفظ ”جاوا“ کي تبديل ڪريون لفظ ”Python“ ۾!
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1.replace("Java", "Python");//попробуем изменить состояние str1, заменив слово "Java" на “Python”
   System.out.println(str2);
}
نتيجو: مان جاوا سان پيار ڪريان ٿو مون کي جاوا سان پيار آهي اهو ٻيهر ڪم نه ڪيو! ٿي سگهي ٿو وکر جو طريقو ڪم نٿو ڪري؟ اچو ته هڪ ٻي ڪوشش ڪريون. مثال طور، substring(). منتقل ٿيل اکرن جي انگن جي بنياد تي هڪ تار کي ترتيب ڏيو. اچو ته اسان جي پهرين 10 اکرن کي ٽرم ڪريون:
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1.substring(10);//обрезаем исходную строку
   System.out.println(str2);
}
نتيجو: مان جاوا سان پيار ڪريان ٿو مون کي جاوا پسند آهي جاوا ۾ اڻ بدليل: آخري، مستقل ۽ ناقابل بدلائي - 3 ڪجھ به نه بدليو آهي. ۽ اهو نه هجڻ گهرجي. جيئن اسان چيو، شيون Stringناقابل بدلجندڙ آهن. پوءِ اهي سڀ طبقاتي طريقا ڪهڙا آهن String؟ اهي لڪير کي ٽرم ڪري سگھن ٿا، ان ۾ ڪردارن کي تبديل ڪري سگھن ٿا، وغيره. جيڪڏهن ڪجهه نه ٿيو ته پوءِ انهن جي ضرورت ڇو؟ اهي ڪري سگهن ٿا! پر اهي هر دفعي هڪ نئين اسٽرنگ اعتراض واپس ڪن ٿا. لکڻ جو ڪو فائدو ناهي:
str1.replace("Java", "Python");
- توھان اصل اعتراض کي تبديل نه ڪندا. پر جيڪڏهن توهان طريقي جو نتيجو هڪ نئين ريفرنس متغير ۾ لکندا، توهان کي فوري طور تي فرق نظر ايندو!
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   String str1AfterReplacement =  str1.replace("Java", "Python");
   System.out.println(str2);

   System.out.println(str1AfterReplacement);
}
اهو ئي طريقو آهي ته اهي سڀئي طريقا Stringڪم ڪن ٿا. توھان ڪجھ به نٿا ڪري سگھو "I love Java" اعتراض سان . بس ھڪڙو نئون اعتراض ٺاھيو ۽ لکو: "نئون اعتراض = "مون کي جاوا پسند آھي" اعتراض سان ڪجھ ٺاھ جوڙ جو نتيجو ." ٻيون ڪهڙيون قسمون ناقابل بدلائيندڙ آهن؟ جنهن مان توهان کي يقيني طور تي هاڻي ياد رکڻ جي ضرورت آهي - سڀ لفافي طبقن جي ابتدائي قسمن کان وڌيڪ ناقابل قابل آهن. Integer, Byte, Character, Short, Boolean, Long, Double, Float- اهي سڀئي طبقا ناقابل قابل شيون ٺاهيندا آهن. ھن ۾ وڏي تعداد ۾ - BigInteger۽ BigDecimal. اسان تازو استثناء جي ذريعي ويا ۽ ان تي رابطو ڪيو StackTrace. تنهن ڪري: java.lang.StackTraceElement ڪلاس جون شيون به ناقابل تبديليون آهن. هي منطقي آهي: جيڪڏهن ڪو ماڻهو اسان جي اسٽيڪ تي ڊيٽا تبديل ڪري سگهي ٿو، اهو ان سان گڏ سڀني ڪم کي رد ڪري سگهي ٿو. تصور ڪريو ڪو ماڻهو StackTrace ۾ وڃي ٿو ۽ OutOfMemoryError کي FileNotFoundException ۾ تبديل ڪري ٿو . ۽ توهان کي هن اسٽيڪ سان ڪم ڪرڻ گهرجي ۽ غلطي جو سبب ڳولڻ گهرجي. ۽ پروگرام سڀني فائلن کي استعمال نٿو ڪري :) تنهن ڪري، محفوظ پاسي تي هجڻ لاء، اهي شيون ناقابل برداشت ڪيون ويون آهن. خير، StackTraceElement سان اهو وڌيڪ يا گهٽ واضح آهي. ڇو ڪو به تارن کي ناقابل بدلائڻ چاهيندو؟ جيڪڏهن انهن جي قدرن کي تبديل ڪرڻ ممڪن هجي ها ته ڇا مسئلو هجي ها. اهو شايد اڃا به وڌيڪ آسان هوندو :/ هن جا ڪيترائي سبب آهن. پهرين، ياداشت کي بچائڻ. تبديل ٿيندڙ تارن ۾ رکي سگھجن ٿا String Pool۽ ساڳيا ئي استعمال ڪري سگھجن ٿا ھر دفعي نوان ٺاھڻ بدران. ٻيو، حفاظت. مثال طور، اڪثر لاگ ان ۽ پاسورڊ ڪنهن به پروگرام ۾ اسٽرنگ آهن. انهن کي تبديل ڪرڻ جو امڪان اختيار سان مسئلا پيدا ڪري سگهي ٿو. ٻيا به سبب آهن، پر اسان اڃا تائين جاوا سکڻ ۾ انهن کي حاصل نه ڪيو آهي- اسان بعد ۾ واپس ڪنداسين.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION