کلاس آبجکت (java.lang.Object)

همه کلاسهای جاوا به طور مستقیم یا غیر مستقیم از کلاس Object که در پکیج java.lang قرار دارد، ارث می برند. کلاس آبجکت در جاوا با کلمه کلیدی Object نشان داده می شود. برای راحتی در این درس از کلمه آبجکت به جای java.lang.Object استفاده می کنیم. در زیر لیست برخی از متدهای معمول در کلاس آبجکت آمده است :

  متد کاربرد
  getClass() یک شیء از کلاس Class را بر می گرداند که نشان دهنده کلاس زمان اجرای شیء است.
  hashCode() کد هش شیء انتخاب شده بر می گرداند.
  equals() مشخص می کند که آیا یک شیئ با شیء دیگر برابر است یا نه؟
  clone() یک نسخه از شیء جاری را بر می گرداند.
  toString() یک نمایش رشته ای از شیء جاری را بر می گرداند.
  notify() با برنامه های چند نخی به کار می رود و نخ منتظر شیء جاری را فعال می کند.
  notifyAll() با برنامه های چند نخی به کار می رود و تمام نخ های منتظر شیء جاری را فعال می کند.
  wait() باعث می شود نخ شیء منتظر شود تا نخ دیگر notify یا notifyAll را فراخوانی کند.
  finalize() با ابزار زباله روب (Garbage Collector) در زمان از بین بردن شیئ فراخوانی می شود.

همه متدهای این کلاس معمولا مورد استفاده قرار نمی گیرند. از آنجاییکه همه کلاسهای جاوا از این کلاس ارث می برند، آنها نیز دارای این متدها به جز متدهای Static می باشند. وقتی یک کلاس ایجاد می کنید، این کلاس به صورت ضمنی از کلاس آبجکت ارث می برد. بنابراین وقتی یک کلاس تعریف می کنید کدها در حقیقت به صورت زیر به وسیله کامپایلر خوانده می شوند :

class MyClass extends java.lang.Object
{
}

اینکه چرا همه کلاسها در جاوا از Object ارث بری می کنند به دلیل امکان استفاده از چندریختی است که در درس آینده درباره آن توضیح می دهیم. به عنوان مثال یکی از سربارگذاری های متد ()System.out.println قبول نوع آبجکت به عنوان آرگومان است. به همین دلیل است که شما می توانید تقریبا هر چیز را به عنوان آرگومان به متد ()System.out.println ارسال کنید. نکته ای که باید در اینجا به آن اشاره کنیم این است که انواع داده های اصلی شیء نیستند و از کلاس Object ارث بری نمی کنند و در نتیجه نمی توانند از متدهای این کلاس هم استفاده کنند. مثلا اجرای کد زیر باعث بروز خطا می شود :

int number = 100;

System.out.println(number.toString());

اگر بخواهید یک نوع int را به نوع رشته ای به صورت بالا تبدیل کنید و متد ()toString را فراخوانی کنید باید از کلاس پوششی به صورت زیر استفاده نمایید :

int number = 100;

System.out.println(new Integer(number).toString());

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

int number = 100;

System.out.println(Integer.toString(number));

همانطور که در بالا هم اشاره شد یکی از متدهای کلاس Object متد ()toString است. این متد کد هش شده شیء جاری را بر می گرداند. به مثال زیر توجه کنید :

package myfirstprogram;

class Person
{
    private String name, family;

    public Person(String n, String f)
    {
        this.name = n;
        this.family = f;
    }
}

public class MyFirstProgram
{

    public static void main(String[] args)
    {
        Person person1 = new Person("John", "SKith");

        System.out.println(person1.toString());
    }
}
object.Person@5cd622e5

همانطور که مشاهده می کنید با فراخوانی متد ()toString یک کد هش شده تولید می شود. البته این کد ممکن است در سیستم شما متفاوت باشد. رفتار پیشفرض متد ()toString به صورت زیر است :

public String toString()
{
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

خروجی این متد یک کد هش شده است ولی شاید شما بخواهید این رفتار پیشفرض را تغییر داده و متد را اصطلاحا Override کنید. فرض کنید در مثال بالا شما می خواهید با فراخوانی این متد مقدار فیلدهای این کلاس چاپ شوند :

   1: package myfirstprogram;
   2: 
   3: class Person
   4: {
   5:     private String name, family;
   6: 
   7:     public Person(String n, String f)
   8:     {
   9:         this.name = n;
  10:         this.family = f;
  11:     }
  12: 
  13:     @Override
  14:     public String toString()       
  15:     {                              
  16:         return name + " " + family;
  17:     }                              
  18: }
  19: 
  20: public class MyFirstProgram
  21: {
  22:     public static void main(String[] args)
  23:     {
  24:         Person person1 = new Person("John", "SKith");
  25: 
  26:         System.out.println(person1.toString());
  27:     }
  28: }
John SKith

همانطور که مشاهده می کنید با Override کردن متد ()toString در خطوط 17-13 و تغییر رفتار پیشفرض آن (خط 16) باعث شدیم که با فراخوانی آن در خط 26 خروجی متفاوتی را دریافت کنیم. خط 26 را به صورت زیر هم می توان نوشت :

System.out.println(person1);

این بدان خاطر است که متد ()println متد ()toString شئ ارسال شده به آن را به طور خودکار فراخوانی می کند.