JavaRush /جاوا بلاگ /Random-SD /10 جاوا ۾ جامد تبديل ڪندڙ تي نوٽس

10 جاوا ۾ جامد تبديل ڪندڙ تي نوٽس

گروپ ۾ شايع ٿيل
جاوا ۾ جامد تبديل ڪندڙ سڌو سنئون طبقي سان لاڳاپيل آهي. جيڪڏهن فيلڊ جامد آهي، پوء اهو طبقي سان تعلق رکي ٿو، جيڪڏهن طريقو جامد آهي، اهو ساڳيو آهي: اهو طبقي سان تعلق رکي ٿو. انهي جي بنياد تي، توهان ڪلاس جو نالو استعمال ڪندي جامد طريقو يا فيلڊ تائين رسائي ڪري سگهو ٿا. مثال طور، جيڪڏهن ڪائونٽر ڪلاس ۾ ڳڻپ جو ميدان مستحڪم آهي، ته پوءِ توهان هڪ سوال سان متغير تائين رسائي ڪري سگهو ٿا جهڙوڪ: Counter.count. 10 جاوا ۾ جامد تبديل ڪندڙ تي نوٽس - 1ان کان اڳ جو اسان نوٽس سان شروع ڪريون، اچو ته ياد رکون (۽ شايد معلوم ڪريو) ڇا جامد آهي ۽ جاوا ۾ جامد ڇا ٿي سگهي ٿو. جامد ھڪڙو تبديل ڪندڙ آھي جيڪو فيلڊ، بلاڪ، طريقو، يا اندروني طبقي تي لاڳو ٿئي ٿو. هي ترميم ڪندڙ اشارو ڪري ٿو ته مضمون موجوده طبقي سان پابند آهي.

جامد ميدان

جڏهن اسان هڪ طبقي سطح جي متغير کي ظاهر ڪريون ٿا، اسان اهو ظاهر ڪريون ٿا ته قيمت هڪ طبقي سان تعلق رکي ٿي. جيڪڏهن توهان ائين نه ڪيو، ته متغير جي قيمت هن طبقي کي استعمال ڪندي ٺاهيل اعتراض تي پابند ٿي ويندي. هن جو ڇا مطلب آهي؟ 10 جاوا ۾ جامد تبديل ڪندڙ تي نوٽس - 2۽ حقيقت اها آهي ته جيڪڏهن متغير جامد نه هجي ته پوءِ هن طبقي جي هر نئين شئي وٽ هن متغير جي پنهنجي قدر هوندي، جنهن کي تبديل ڪرڻ سان اسان ان کي صرف هڪ شئي ۾ تبديل ڪريون ٿا: مثال طور، اسان وٽ ڪار ڪلاس آهي هڪ غير. - جامد متغير:
public class Car {
  int km;
}
پوء بنيادي طور تي:
Car orangeCar = new Car();
orangeCar.km = 100;

Car blueCar = new Car();
blueCar.km = 85;

System.out.println("Orange car - " + orangeCar.km);
System.out.println("Blue car - " + blueCar.km);
اسان کي حاصل ڪيل پيداوار آهي:

Orange car - 100
Blue car - 85
جئين توهان ڏسي سگهو ٿا، هر شئي جو پنهنجو متغير آهي، جنهن جي تبديلي صرف هن اعتراض لاء ٿيندي آهي. خير، جيڪڏهن اسان وٽ جامد متغير آهي، ته پوءِ هي عالمي قدر هر ڪنهن لاءِ ساڳي آهي: هاڻي اسان وٽ ڪار آهي جامد متغير سان:
public class Car {
  static int km;
}
ان کان پوء مکيه ۾ ساڳيو ڪوڊ ڪنسول ڏانهن آئوٽ ڪندو:

Orange car - 85
Blue car - 85
آخرڪار، اسان وٽ اسان سڀني لاء هڪ متغير آهي، ۽ هر وقت اسين ان کي تبديل ڪندا آهيون. جامد متغيرن کي عام طور تي ڪنهن اعتراض جي حوالي سان نه پهچندا آهن - orangeCar.km، پر طبقي جي نالي سان - Car.km

جامد بلاڪ

اتي ٻه شروعاتي بلاڪ آهن - باقاعده ۽ جامد. بلاڪ جو مقصد اندروني متغير کي شروع ڪرڻ جو مقصد آهي. جيڪڏهن بلاڪ نارمل آهي ته پوءِ اعتراض جي اندروني متغيرن کي ان سان شروع ڪيو ويندو، پر جيڪڏهن اهو جامد هوندو ته پوءِ جامد متغير (يعني طبقاتي متغير) انهن کي مقرر ڪيو ويندو. جامد شروعاتي بلاڪ سان ڪلاس جو مثال:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

جامد طريقو

جامد طريقا باقاعده طريقن کان مختلف آهن ان ۾ اهي پڻ پابند هوندا آهن ڪنهن شئي جي بجاءِ هڪ طبقي سان. جامد طريقي جي هڪ اهم ملڪيت اها آهي ته اهو صرف جامد متغيرن / طريقن تائين رسائي ڪري سگهي ٿو. مثال طور، اچو ته هڪ طبقي کي ڏسو جيڪو هڪ قسم جو انسداد هوندو جيڪو طريقي جي ڪالن جي ٽريڪ رکي ٿو:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
اچو ته ان کي بنيادي طور سڏيو:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
۽ اسان حاصل ڪريون ٿا ڪنسول کي ٻاھر موڪليو:

Текущее meaning счётчика - 1
Текущее meaning счётчика - 2
Текущее meaning счётчика - 3

جاوا ۾ جامد ڪلاس

صرف هڪ اندروني طبقو جامد طبقو ٿي سگهي ٿو. ٻيهر، اهو طبقو ٻاهرئين طبقي سان ڳنڍيو ويو آهي، ۽ جيڪڏهن ٻاهرئين طبقي کي ڪنهن ٻئي طبقي کان وراثت ملي ٿي، ته پوء اهو وارث نه ٿيندو. ان کان علاوه، هي طبقو وراثت ٿي سگهي ٿو، جيئن اهو ڪنهن ٻئي طبقي کان وراثت ٿي سگهي ٿو ۽ انٽرفيس کي لاڳو ڪري ٿو. لازمي طور تي، هڪ جامد نسٽڊ ڪلاس ڪنهن ٻئي اندروني طبقي کان مختلف ناهي، سواء ان جي ان جي اعتراض ۾ ٻاهرئين طبقي اعتراض جو حوالو نه هوندو آهي جيڪو ان کي ٺاهيو آهي. بهرحال، هي هڪ جامد ڪلاس بنائي ٿو تمام گهڻو هڪ باقاعده غير اينسٽ ٿيل هڪ سان، ڇاڪاڻ ته فرق صرف اهو آهي ته اهو ڪنهن ٻئي طبقي ۾ لپي ويو آهي. ڪجهه حالتن ۾، اهو اسان لاء هڪ فائدو آهي، ڇاڪاڻ ته ان مان اسان کي ٻاهرئين طبقي جي نجي جامد متغير تائين رسائي آهي. هڪ nested جامد طبقي جو مثال:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
ھن طبقي جو ھڪڙو مثال ٺاھيو ۽ اندروني متغير جي قيمت کي ترتيب ڏيو:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
جامد طريقا/متغير/ڪلاس استعمال ڪرڻ لاءِ، اسان کي ضرورت نه آهي ته ان طبقي جو ڪو اعتراض ٺاهيو. يقينا، رسائي جي ترميمن کي حساب ۾ ورتو وڃي. مثال طور، فيلڊ privateصرف ان طبقي جي اندر رسائي لائق آهن جنهن ۾ اهي اعلان ڪيا ويا آهن. فيلڊس protectedسڀني طبقن لاءِ دستياب آھن ھڪڙي پيڪيج اندر ( پيڪيج )، ۽ گڏوگڏ سڀني نسلي طبقن لاءِ پيڪيج کان ٻاھر. وڌيڪ تفصيلن لاءِ، ڏسو مضمون ” نجي بمقابله محفوظ بمقابله عوام “. increment()فرض ڪريو ڪلاس ۾ ھڪڙو جامد طريقو آھي Counterجنھن جو ڪم انسداد کي وڌائڻ آھي count. ھن طريقي کي سڏڻ لاءِ، توھان استعمال ڪري سگھو ٿا فارم جي دعوت Counter.increment(). Counterجامد فيلڊ يا طريقي تائين رسائي حاصل ڪرڻ لاءِ ڪلاس کي فوري ڪرڻ جي ڪا ضرورت ناهي . جامد ۽ غير جامد شين (طبقاتي ميمبرن) جي وچ ۾ اهو بنيادي فرق آهي. مان توهان کي هڪ ڀيرو ٻيهر ياد ڏياران ٿو ته جامد طبقي جا ميمبر سڌو سنئون طبقي سان تعلق رکن ٿا، نه ان جي مثال سان. اهو آهي، هڪ جامد متغير جو قدر countساڳيو هوندو قسم جي سڀني شين لاء Counter. بعد ۾ هن آرٽيڪل ۾، اسان جاوا ۾ جامد موڊيفائر استعمال ڪرڻ جي بنيادي پهلوئن تي نظر ڪنداسين، انهي سان گڏ ڪجهه خاصيتون جيڪي توهان کي اهم پروگرامنگ تصورن کي سمجهڻ ۾ مدد ڏين ٿيون.

ڇا هر پروگرامر کي ڄاڻڻ گهرجي ته جاوا ۾ جامد تبديل ڪندڙ بابت

هن حصي ۾، اسين جامد طريقن، شعبن ۽ طبقن کي استعمال ڪرڻ جي بنيادي ڳالهين تي نظر ڪنداسين. اچو ته متغيرن سان شروع ڪريون.
  1. توهان هڪ ڪلاس جي غير جامد ميمبرن تائين رسائي نٿا ڪري سگهو جامد حوالي سان، جهڙوڪ طريقو يا بلاڪ. هيٺ ڏنل ڪوڊ گڏ ڪرڻ سان غلطي ٿيندي:

    public class Counter{
    private int count;
    public static void main(String args[]){
       System.out.println(count); //compile time error
    }}

    هي جاوا پروگرامرز پاران ڪيل سڀ کان عام غلطين مان هڪ آهي، خاص طور تي نوان. جيئن ته طريقو mainجامد آهي، پر متغير countنه آهي، انهي صورت ۾ printlnطريقي جي اندر جو طريقو main"Compile time error" اڇلائي ڇڏيندو.

  2. В отличие от локальных переменных, статические поля и методы НЕ потокобезопасны (Thread-safe) в Java. На практике это одна из наиболее частых причин возникновения проблем связанных с безопасностью мультипоточного программирования. Учитывая что каждый экземпляр класса имеет одну и ту же копию статической переменной, то такая переменная нуждается в защите — «залочивании» классом. Поэтому при использовании статических переменных, убедитесь, что они должным образом синхронизированы (synchronized), во избежание проблем, например таких How «состояние гонки» (race condition).

  3. Статические методы имеют преимущество в применении, т.к. отсутствует необходимость каждый раз создавать новый an object для доступа к таким методам. Статический метод можно вызвать, используя тип класса, в котором эти методы описаны. Именно поэтому, подобные методы How нельзя лучше подходят в качестве методов-фабрик (factory), и методов-утorт (utility). Класс java.lang.Math — замечательный пример, в котором почти все методы статичны, по этой же причине классы-утorты в Java финализированы (final).

  4. Другим важным моментом является то, что вы НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) instead of переопределения. Это явление известно How сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен How в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. Рассмотрим пример:

    class Vehicle{
         public static void  kmToMiles(int km){
              System.out.println("Inside parent class/static method");
         } }
    
    class Car extends Vehicle{
         public static void  kmToMiles(int km){
              System.out.println("Inside child class/static method ");
         } }
    
    public class Demo{
       public static void main(String args[]){
          Vehicle v = new Car();
           v.kmToMiles(10);
      }}

    Вывод в консоль:

    Внутри родительского класса/статического метода

    Код наглядно демонстрирует: несмотря на то, что an object имеет тип Car, вызван статический метод из класса Vehicle, т.к. произошло обращение к методу во время компиляции. И заметьте, ошибки во время компиляции не возникло!

  5. Объявить статическим также можно и класс, за исключением классов верхнего уровня. Такие классы известны How «вложенные статические классы» (nested static class). Они бывают полезными для представления улучшенных связей. Яркий пример вложенного статического класса — HashMap.Entry, который предоставляет структуру данных внутри HashMap. Стоит заметить, также How и любой другой внутренний класс, вложенные классы находятся в отдельном файле .class. Таким образом, если вы объявor пять вложенных классов в вашем главном классе, у вас будет 6 файлов с расширением .class. Ещё одним примером использования является объявление собственного компаратора (Comparator), например компаратор по возрасту (AgeComparator) в классе сотрудники (Employee).

  6. Модификатор static также может быть объявлен в статичном блоке, более известным How «Статический блок инициализации» (Static initializer block), который будет выполнен во время загрузки класса. Если вы не объявите такой блок, то Java соберёт все статические поля в один список и выполнит его во время загрузки класса. Однако, статичный блок НЕ может пробросить перехваченные исключения, но может выбросить не перехваченные. В таком случае возникнет «Exception Initializer Error». На практике, любое исключение возникшее во время выполнения и инициализации статических полей, будет завёрнуто Java в эту ошибку. Это также самая частая причина ошибки «No Class Def Found Error», т.к. класс не находился в памяти во время обращения к нему.

  7. Полезно знать, что статические методы связываются во время компиляции, в отличие от связывания виртуальных or не статических методов, которые связываются во время исполнения на реальном an objectе. Следовательно, статические методы не могут быть переопределены в Java, т.к. полиморфизм во время выполнения не распространяется на них. Это важное ограничение, которое необходимо учитывать, объявляя метод статическим. В этом есть смысл, только тогда, когда нет возможности or необходимости переопределения такого метода классами-наследниками. Методы-фабрики и методы-утorты хорошие образцы применения модификатора static. Джошуа Блох выделил несколько преимуществ использования статичного метода-фабрики перед конструктором, в книге «Effective Java», которая является обязательной для прочтения каждым программистом данного языка.

  8. Важным свойством статического блока является инициализация. Статические поля or переменные инициализируются после загрузки класса в память. Порядок инициализации сверху вниз, в том же порядке, в Howом они описаны в исходном файле Java класса. Поскольку статические поля инициализируются на потокобезопасный манер, это свойство также используется для реализации паттерна Singleton. Если вы не используется список Enum How Singleton, по тем or иным причинам, то для вас есть хорошая альтернатива. Но в таком случае необходимо учесть, что это не «ленивая» инициализация. Это означает, что статическое поле будет проинициализировано ещё ДО того How кто-нибудь об этом «попросит». Если an object ресурсоёмкий or редко используется, то инициализация его в статическом блоке сыграет не в вашу пользу.

  9. سيريلائيزيشن جي دوران، صرف transientمتغير وانگر، جامد فيلڊ سيريل نه آهن. درحقيقت، جيڪڏهن توهان ڪنهن به ڊيٽا کي هڪ جامد فيلڊ ۾ محفوظ ڪريو ٿا، ته پوءِ ڊيسيريلائيزيشن کان پوءِ نئين شئي ان جي پرائمري (ڊفالٽ) قيمت تي مشتمل هوندي، مثال طور، جيڪڏهن جامد فيلڊ قسم جي هڪ متغير هئي، ته پوءِ intڊيسيريلائيزيشن کان پوءِ ان جي قيمت صفر ٿي ويندي، جيڪڏهن قسم float0.0 آهي، جيڪڏهن قسم Object- null. ايمانداري سان، هي جاوا انٽرويوز ۾ سيريلائيزيشن جي حوالي سان اڪثر پڇيا ويا سوالن مان هڪ آهي. ڪنهن شئي جي باري ۾ سڀ کان اهم ڊيٽا هڪ جامد ميدان ۾ ذخيرو نه ڪريو!

  10. ۽ آخر ۾، اچو ته بابت ڳالهايون static import. هي ترميم ڪندڙ معياري آپريٽر سان تمام گهڻو عام آهي import، پر ان جي برعڪس، اهو توهان کي اجازت ڏئي ٿو ته هڪ طبقي جي هڪ يا سڀني جامد ميمبرن کي درآمد ڪرڻ جي. جڏهن جامد طريقا درآمد ڪري رهيا آهن، انهن تائين رسائي ٿي سگهي ٿي جيئن اهي ساڳيا طبقي ۾ بيان ڪيا ويا آهن، ساڳئي طرح جڏهن فيلڊ کي درآمد ڪندي، اسان انهن تائين رسائي ڪري سگهون ٿا بغير طبقي جو نالو بيان ڪرڻ کان سواء. ھي فيچر جاوا ورزن 1.5 ۾ متعارف ڪرايو ويو، ۽ جڏھن صحيح استعمال ڪيو وڃي، ته ڪوڊ جي پڙھڻ جي صلاحيت کي بھتر بڻائي ٿو. هي تعمير گهڻو ڪري JUnit ٽيسٽ ۾ مليو آهي ، ڇاڪاڻ ته تقريبن سڀئي ٽيسٽ ڊولپر استعمال ڪن ٿا static importاثبات جا طريقا، مثال طور، assertEquals()۽ انهن جا اوور لوڊ ٿيل نقل. جيڪڏهن ڪجھ به واضح ناهي، اضافي معلومات لاء ڀليڪار .

اهو ئي سڀ ڪجهه آهي. هر پروگرامر کي جاوا ۾ جامد تبديل ڪندڙ جي باري ۾ مٿين سڀني نقطن کي ڄاڻڻ گهرجي . هي آرٽيڪل جامد متغير، فيلڊ، طريقن، شروعاتي بلاڪ ۽ واردات بابت بنيادي معلومات ڍڪي ٿو. ڪجھ اهم ملڪيتن سميت، جاوا ۾ پروگرام لکڻ ۽ سمجھڻ وقت جن جي ڄاڻ نازڪ آھي. مون کي اميد آهي ته هر ڊولپر جامد تصورات کي استعمال ڪرڻ ۾ پنهنجون صلاحيتون مڪمل ڪندو ڇاڪاڻ ته ... اهو سنجيده پروگرامنگ لاء تمام ضروري آهي."
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION