۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

وراثت در جاوا، قسمت ۲: شی و روش های آن

هرچه با Object و روش های آن بیشتر آشنا باشید، می توانید کارهای بیشتری با برنامه های جاوا خود انجام دهید.

هرچه با Object و روش های آن بیشتر آشنا باشید، می توانید کارهای بیشتری با برنامه های جاوا خود انجام دهید.

کتابخانه کلاس استاندارد جاوا از هزاران کلاس و انواع مرجع دیگر تشکیل شده است. علیرغم تفاوت در قابلیت های آنها، هر یک از این انواع به طور مستقیم یا غیر مستقیم کلاس Object را گسترش می دهند. آنها با هم یک سلسله مراتب وراثت عظیم را تشکیل می دهند.

 نیمه اول این آموزش اصول وراثت در جاوا را معرفی کرد. یاد گرفتید که چگونه از کلیدواژه‌های extends و super جاوا برای استخراج کلاس فرزند از کلاس والد، فراخوانی سازنده‌ها و متدهای کلاس والد، روش‌های لغو و غیره استفاده کنید. اکنون، ما تمرکز خود را بر روی سلسله مراتب ارث بری کلاس جاوا، java.lang.Object معطوف خواهیم کرد.

مطالعه Object و روش‌های آن به شما درک کاربردی‌تری از وراثت جاوا و نحوه عملکرد آن در برنامه‌هایتان می‌دهد. 

آنچه در این آموزش جاوا خواهید آموخت

  • همه چیز درباره Object: سوپرکلاس جاوا
  • نحوه گسترش Object: یک مثال
  • کاری که متد getClass() جاوا انجام می دهد
  • کاری که متد clone() جاوا انجام می دهد
  • کاری که متد ()quals Java انجام می دهد
  • کاری که متد finalize() جاوا انجام می دهد
  • کاری که متد hashCode() جاوا انجام می دهد
  • کاری که متد toString() جاوا انجام می دهد
  • کارهایی که جاوا () و متدهای notify() انجام می دهند

همه چیز درباره Object: superclass جاوا

Object کلاس ریشه یا سوپرکلاس نهایی سایر کلاس‌های جاوا است. ذخیره شده در بسته java.lang، Object متدهای زیر را اعلام می کند که همه کلاس های دیگر به ارث می برند:

  • کلون شی محافظت شده()
  • بولی برابر است(Object Obj)
  • حفاظت شده void finalize()
  • Class getClass()
  • int hashCode()
  • void notify()
  • void notifyAll()
  • String toString()
  • void wait()
  • انتظار بیهوده (مدت زمان طولانی)
  • انتظار خالی (مدت زمان طولانی، نانوهای داخلی)

یک کلاس جاوا این متدها را به ارث می برد و می تواند هر روشی را که نهایی اعلام نشده است لغو کند. برای مثال، روش غیرfinal toString() را می توان لغو کرد، در حالی که روش های final wait() نمی تواند.

ما به هر یک از این روش‌ها و نحوه استفاده از آنها برای انجام وظایف خاص در زمینه کلاس‌های جاوا نگاه خواهیم کرد. ابتدا، بیایید قوانین و مکانیسم های اساسی برای وراثت Object را در نظر بگیریم.

انواع عمومی

در لیست بالا، ممکن است به getClass() توجه کرده باشید که نوع بازگشت Class نمونه ای از نوع عمومی در مقاله آینده در مورد انواع عمومی بحث خواهم کرد.

نحوه گسترش Object: یک مثال

یک کلاس می تواند به صراحت Object را گسترش دهد، همانطور که در فهرست ۱ نشان داده شده است.

public class Employee extends Object
{
   private String name;

   public Employee(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return name;
   }

   public static void main(String[] args)
   {
      Employee emp = new Employee("John Doe");
      System.out.println(emp.getName());
   }
}

از آنجایی که می توانید حداکثر یک کلاس دیگر را گسترش دهید (از قسمت ۱ به خاطر بیاورید که جاوا از وراثت چندگانه مبتنی بر کلاس پشتیبانی نمی کند)، مجبور نیستید به صراحت Object< را گسترش دهید. /code>; در غیر این صورت، شما نمی توانید هیچ کلاس دیگری را گسترش دهید. بنابراین، همانطور که در فهرست ۲ نشان داده شده است، Object را بطور ضمنی گسترش می دهید.

public class Employee
{
   private String name;

   public Employee(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return name;
   }

   public static void main(String[] args)
   {
      Employee emp = new Employee("John Doe");
      System.out.println(emp.getName());
   }
}

فهرست ۱ یا فهرست ۲ را به صورت زیر کامپایل کنید:

javac Employee.java

برنامه حاصل را اجرا کنید:

java Employee

شما باید خروجی زیر را مشاهده کنید:

John Doe

چه کاری که Java's getClass() انجام می دهد

متد getClass() کلاس زمان اجرا هر شیئی را که بر روی آن فراخوانی می شود برمی گرداند. کلاس زمان اجرا با یک شی Class نشان داده می شود که در بسته java.lang یافت می شود. Class همچنین نقطه ورود به Java Reflection API است که برنامه جاوا برای یادگیری ساختار خود استفاده می کند.

اشیاء کلاس و روش‌های همگام‌سازی استاتیک

شیء Class برگشتی، شیئی است که توسط روشهای Static synchronized کلاس نمایش داده شده قفل می شود. برای مثال، static synchronized void foo() {}. (همگام سازی جاوا را در یک آموزش آینده معرفی خواهم کرد.)

متد clone() جاوا چه می کند

متد clone() یک کپی از شیئی را که روی آن فراخوانی شده است ایجاد و برمی گرداند. از آنجا که نوع برگشتی clone() Object است، مرجع شی که clone() برمی‌گرداند باید قبل از تخصیص به نوع واقعی شیء فرستاده شود. که به متغیری از نوع شی ارجاع می دهد. کد موجود در فهرست ۳ شبیه سازی را نشان می دهد.

class CloneDemo implements Cloneable
{
   int x;

   public static void main(String[] args) throws CloneNotSupportedException
   {
      CloneDemo cd = new CloneDemo();
      cd.x = 5;
      System.out.println("cd.x = " + cd.x);
      CloneDemo cd2 = (CloneDemo) cd.clone();
      System.out.println("cd2.x = " + cd2.x);
   }
}

کلاس CloneDemo فهرست ۳، رابط Cloneable را که در بسته java.lang یافت می‌شود، پیاده‌سازی می‌کند. Cloneable توسط کلاس (از طریق کلمه کلیدی implements) پیاده سازی می شود تا از روش clone() Object جلوگیری کند. پرتاب نمونه ای از کلاس CloneNotSupportedException (همچنین در java.lang یافت می شود).

CloneDemo یک فیلد نمونه مبتنی بر int به نام x و یک روش main() را اعلام می‌کند که تمرین می‌کند. این کلاس. main() با یک عبارت throws اعلان می شود که CloneNotSupportedException را از پشته فراخوانی متد عبور می دهد.

main() ابتدا CloneDemo را نمونه‌سازی می‌کند و کپی نمونه حاصل از x را به ۵ مقداردهی می‌کند. سپس مقدار x نمونه را خروجی می‌کند و clone() را در این نمونه فراخوانی می‌کند و قبل از ذخیره مرجع، شیء برگشتی را به CloneDemo ارسال می‌کند. در نهایت، مقدار فیلد x کلون را خروجی می‌دهد.

فهرست ۳ (javac CloneDemo.java) را کامپایل کنید و برنامه را اجرا کنید (java CloneDemo). شما باید خروجی زیر را مشاهده کنید:

cd.x = 5
cd2.x = 5

نیازی به لغو clone() در مثال قبلی نداشتیم زیرا کدی که clone() را فراخوانی می‌کند در کلاس در حال شبیه‌سازی قرار دارد ( CloneDemo). اگر تماس با clone() در کلاس دیگری قرار داشت، باید clone() را لغو کنید.

از آنجایی که clone() محافظت شده اعلام شده است، اگر این کار را نمی‌کردید، پیام "کلون دسترسی محافظت شده در شیء را دارد" دریافت خواهید کرد. قبل از کامپایل کردن کلاس، آن را لغو کنید. فهرست ۴ یک نسخه بازسازی شده از فهرست ۳ است که clone() را نشان می دهد.

class Data implements Cloneable
{
   int x;

   @Override
   public Object clone() throws CloneNotSupportedException
   {
      return super.clone();
   }
}

class CloneDemo
{
   public static void main(String[] args) throws CloneNotSupportedException
   {
      Data data = new Data();
      data.x = 5;
      System.out.println("data.x = " + data.x);
      Data data2 = (Data) data.clone();
      System.out.println("data2.x = " + data2.x);
   }
}

فهرست ۴ یک کلاس Data را اعلام می‌کند که نمونه‌های آن باید شبیه‌سازی شوند. داده رابط Cloneable را برای جلوگیری از پرتاب CloneNotSupportedException هنگام فراخوانی متد clone() پیاده‌سازی می‌کند. سپس فیلد نمونه مبتنی بر int را x اعلام می‌کند و روش clone() را لغو می‌کند. روش clone() super.clone() را برای فراخوانی superclass خود (یعنی Object) clone() اجرا می کند. روش . روش clone() نادیده گرفته شده، CloneNotSupportedException را در بند پرتاب خود شناسایی می کند.

فهرست ۴ همچنین یک کلاس CloneDemo را اعلام می کند که: داده را نمونه سازی می کند، فیلد نمونه آن را مقدار دهی اولیه می کند، مقدار فیلد نمونه را خروجی می دهد، داده ها را شبیه سازی می کند. code> شی، و مقدار فیلد نمونه آن را خروجی می دهد.

فهرست ۴ (javac CloneDemo.java) را کامپایل کنید و برنامه را اجرا کنید (java CloneDemo). شما باید خروجی زیر را مشاهده کنید:

data.x = 5
data2.x = 5

شبیه سازی کم عمق

شبیه‌سازی سطحی (همچنین به عنوان کپی‌برداری سطحی شناخته می‌شود) به کپی کردن فیلدهای یک شیء بدون کپی کردن هر شیئی اشاره می‌کند که از فیلدهای مرجع آن شیء ارجاع داده می‌شود (در صورت وجود هرگونه مرجع) زمینه های). لیست ۳ و ۴ در واقع شبیه سازی سطحی را نشان می دهد. هر یک از فیلدهای cdcd2data-، و data2-مرجع، شیئی را که دارای کپی خودش از فیلد x مبتنی بر int.

شبیه سازی کم عمق زمانی که همه فیلدها از نوع اولیه هستند و (در بسیاری از موارد) زمانی که هر فیلد مرجع به اشیاء تغییر ناپذیر (غیر قابل تغییر) اشاره دارد، به خوبی کار می کند. با این حال، اگر هر یک از اشیاء ارجاع شده قابل تغییر باشد، تغییرات ایجاد شده در هر یک از این اشیاء توسط شی اصلی و کلون(های) آن قابل مشاهده است. فهرست ۵ نشان می دهد.