JavaRush /وبلاگ جاوا /Random-FA /بسته بندی، باز کردن و بسته بندی

بسته بندی، باز کردن و بسته بندی

در گروه منتشر شد
سلام! شما قبلاً با انواع اولیه کاملاً آشنا هستید و با آنها زیاد کار کرده اید. بسته بندی، باز کردن و بسته بندی - 1اصول اولیه در برنامه نویسی، و به ویژه در جاوا، مزایای بسیاری دارند: حافظه کمی را اشغال می کنند، در نتیجه کارایی برنامه را افزایش می دهند، و به وضوح به محدوده مقادیر تقسیم می شوند. با این حال، در فرآیند یادگیری جاوا، بیش از یک بار، مانند یک مانترا، تکرار کرده ایم: " در جاوا همه چیز یک شی است ." اما بدوی ها رد مستقیم این کلمات هستند. آنها اشیاء نیستند. پس اصل "همه چیز یک شی است" نادرست است؟ نه واقعا. در جاوا، هر نوع اولیه برادر دوقلوی خود، کلاس wrapper ( ) دارد Wrapper. لفاف چیست؟ Wrapper یک کلاس ویژه است که ارزش یک اولیه را در خود ذخیره می کند. اما از آنجایی که این یک کلاس است، می تواند نمونه های خود را ایجاد کند. آنها در حالی که اشیاء واقعی هستند، مقادیر اولیه لازم را در داخل ذخیره می کنند. نام کلاس های wrapper بسیار شبیه به نام های اولیه مربوطه است یا کاملاً با آنها مطابقت دارد. بنابراین، یادآوری آنها بسیار آسان خواهد بود.
کلاس های Wrapper برای انواع داده های اولیه
انواع داده های اولیه کلاس های لفاف دار
بین المللی عدد صحیح
کوتاه کوتاه
طولانی طولانی
بایت بایت
شناور شناور
دو برابر دو برابر
کاراکتر شخصیت
بولی بولی
اشیاء کلاس Wrapper درست مانند هر چیز دیگری ایجاد می شوند:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
کلاس های Wrapper به شما این امکان را می دهد که معایب انواع اولیه را کاهش دهید. بارزترین آنها این است که بدوی ها روشی ندارند . به عنوان مثال، آنها متد ندارند toString()، بنابراین شما نمی توانید مثلاً یک عدد را intبه رشته تبدیل کنید. اما با یک کلاس بسته بندی Integerآسان است.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
همچنین مشکلاتی برای تبدیل معکوس وجود خواهد داشت. فرض کنید رشته ای داریم که مطمئناً می دانیم حاوی یک عدد است. اما در مورد نوع اولیه، intنمی توانیم این عدد را از رشته بدست آوریم و در واقع به عدد تبدیل کنیم. اما به لطف کلاس های wrapper، ما اکنون این فرصت را داریم.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
خروجی: 1166628 ما با موفقیت یک عدد را از یک رشته بازیابی کردیم و آن را به یک متغیر مرجع اختصاص دادیم Integer i. به هر حال، در مورد پیوندها. قبلاً می‌دانید که پارامترها به روش‌های مختلف به متدها ارسال می‌شوند: اولیه‌ها با مقدار و اشیا با مرجع ارسال می‌شوند. شما می توانید از این دانش هنگام ایجاد متدهای خود استفاده کنید: اگر روش شما مثلاً با اعداد کسری کار می کند، اما به منطق عبور از طریق مرجع نیاز دارید، می توانید پارامترها را به Double/Floatجای double/float. علاوه بر این، کلاس های wrapper علاوه بر متدها، دارای فیلدهای ثابت هستند که استفاده از آنها بسیار راحت است. به عنوان مثال، تصور کنید که اکنون با یک کار روبرو هستید: حداکثر تعداد ممکن را در کنسول چاپ کنید intو سپس حداقل تعداد ممکن را. به نظر می رسد این کار ابتدایی است، اما با این حال، شما به سختی قادر به انجام آن بدون گوگل خواهید بود. و کلاس های wrapper به راحتی به شما امکان می دهد "مشکلات روزمره" زیر را حل کنید:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
چنین زمینه هایی به شما امکان می دهد از کارهای جدی تر منحرف نشوید. ناگفته نماند که در فرآیند چاپ شماره 2147483647 (این دقیقا MAX_VALUE است) اشتباه تایپ کردن آن تعجب آور نیست :) علاوه بر این، در یکی از سخنرانی های قبلی قبلاً توجه را به این واقعیت جلب کردیم که اشیاء کلاس های wrapper تغییر ناپذیر هستند .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
خروجی: 0 شیئی که مرجع ابتدا به آن اشاره کرده است، аوضعیت خود را تغییر نداده است، در غیر این صورت مقدار bنیز تغییر می کرد. مانند String, به جای تغییر وضعیت شی wrapper، یک شی کاملاً جدید در حافظه ایجاد می شود. چرا سازندگان جاوا در نهایت تصمیم به حفظ انواع اولیه در زبان گرفتند؟ از آنجایی که همه چیز باید یک شی باشد، و ما قبلاً کلاس‌های wrapper داریم که می‌توان از آنها برای بیان هر چیزی که اولیه‌ها بیان می‌کنند استفاده کرد، چرا آنها را در زبان رها نکنیم و اولیه‌ها را حذف نکنیم؟ پاسخ ساده است - عملکرد. انواع اولیه بدوی نامیده می شوند زیرا فاقد بسیاری از ویژگی های "سنگین" اشیاء هستند. بله، یک شی روش‌های راحت زیادی دارد، اما همیشه به آن‌ها نیاز ندارید. گاهی اوقات فقط به عدد 33 یا 2.62 یا مقدار true/ نیاز دارید false. در شرایطی که تمام مزایای اشیاء مهم نیستند و برای کارکرد برنامه مورد نیاز نیستند، primitives کار بسیار بهتری انجام خواهند داد.

بسته بندی خودکار / باز کردن بسته بندی خودکار

یکی از ویژگی های primitives و کلاس های wrapper آنها در جاوا autoboxing/autounboxing است بسته بندی، باز کردن و بسته بندی - 2 بیایید این مفهوم را درک کنیم. همانطور که من و شما قبلاً یاد گرفتیم، جاوا یک زبان شی گرا است. این بدان معنی است که تمام برنامه های نوشته شده در جاوا از اشیاء تشکیل شده اند. بدوی اشیاء نیستند. با این حال، متغیر کلاس wrapper را می توان مقداری از نوع ابتدایی نسبت داد. این فرآیند اتوباکسینگ نامیده می شود . به همین ترتیب، یک متغیر از نوع اولیه را می توان یک شی از یک کلاس wrapper نسبت داد. به این فرآیند اتوآنباکسینگ می گویند . مثلا:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
در خط 5، ما به x اولیه مقدار y را اختصاص می دهیم که یک شی از کلاس wrapper است Integer. همانطور که می بینید، هیچ اقدام اضافی برای این مورد نیاز نیست: کامپایلر این را می داند intو Integerدر واقع همان چیز را می داند . این باز کردن بسته بندی خودکار است. در خط 6 با اتوباکسینگ نیز همین اتفاق می افتد: به شی y به راحتی مقدار اولیه (x*123) نسبت داده می شود. این نمونه ای از بسته بندی خودکار است. به همین دلیل است که کلمه "auto" اضافه شده است: برای اختصاص ارجاعات اولیه به اشیاء کلاسهای wrapper آنها (و بالعکس) نیازی به انجام کاری ندارید، همه چیز به طور خودکار اتفاق می افتد . راحت است، درست است؟ :) یکی دیگر از سهولت بسیار عالی بسته بندی خودکار / باز کردن بسته بندی خودکار در عملکرد روش ها آشکار می شود. واقعیت این است که پارامترهای روش نیز در معرض بسته بندی خودکار و بسته بندی خودکار هستند . و به عنوان مثال، اگر یکی از آنها دو شی را به عنوان ورودی بگیرد Integer، ما به راحتی می توانیم ابتدایی های معمولی را در آنجا پاس کنیم int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
خروجی: شما عدد 7 را وارد کردید. برعکس عمل می کند:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
نکته مهمی که باید به خاطر داشته باشید: اتوباکسینگ و جعبه گشایی برای آرایه ها کار نمی کند !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
تلاش برای ارسال یک آرایه از موارد اولیه به روشی که آرایه ای از اشیاء را به عنوان ورودی می گیرد، باعث خطای کامپایل می شود. در نهایت، اجازه دهید یک بار دیگر به طور خلاصه ابتدا و wrappers Primitives را با هم مقایسه کنیم:
  • مزیت عملکردی دارند
لفاف ها:
  • آنها به شما اجازه می دهند که اصل "همه چیز یک شی است" را نقض نکنید، به طوری که اعداد، نمادها و مقادیر بولی ​درست/نادرست از این مفهوم خارج نشوند.
  • با ارائه روش ها و زمینه های مناسب، توانایی کار با این مقادیر را گسترش دهید
  • زمانی ضروری است که برخی از روش ها می توانند منحصراً با اشیا کار کنند
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION