menusearch
javapro.ir

اشتباه اول: صدا زدن یک عضو غیر استاتیک در یک متد استاتیک در جاوا

جستجو
شنبه ۶ مرداد ۱۴۰۳ | ۱۸:۱۳:۴۶
۱۳۹۸/۱۰/۲۴ سه شنبه
(4)
(0)
اشتباه اول: صدا زدن یک عضو غیر استاتیک در یک متد استاتیک در جاوا
اشتباه اول: صدا زدن یک عضو غیر استاتیک در یک متد استاتیک در جاوا

خطاها و اشتباهات متداول زبان برنامه نویسی جاوا

 

به نام خدای مهربانی ها

سخن مدرس:


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


دوست عزیز! توجه داشته باش که اشتباه کردن اینطور که میگن هم اصلا بد نیست! خطاکردن برای هر فردی که میخواد روز به روز بهتر بشه و تجربه اش بیشتر و بیشتر بشه خیلی خووووبه! چرا؟ چون درک شما رو نسبت به مشکلات و چالش های برنامه نویسی بالا می‌برد و همچنین در بهبود مهارت های برنامه نویسی شما را بهتر و بهترتر می‌کند!


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


صرف نظر از این که چقدر در زمینه جاوا حرفه ای هستی محال است که یکی از اشتباهاتی که جلوتر به آنها خواهیم پرداخت رو در هنگام یادگیری جاوا انجام نداده باشی :-)

 

 


اشتباه اول:


1.Accessing non-static members from static methods (mostly from the main method)


•    صدا زدن یک عضو غیراستاتیک در یک متد استاتیک که متداول ترین ان صدا زدن متغیر نمونه غیر استاتیک یا یک متد غیراستایک کلاس در متد استاتیک main است:

 

مثال: به قطعه کد زیر توجه کنید:

 

package www.javapro.ir;

public class Test1 {

    public int number; // instance variable

   public static void main(String[] args) {
   
        number = 10;  // compile error

    System.out.println(number);  // compile error
   }

}

 

 

خروجی: خطای کامپایل داده می‌شود.

 

توضیحات:

 

number = 10;  // compile error
System.out.println(number);  // compile error


•    دلیل خطای کامپایل این است که متغیر number یک متغیر نمونه کلاس غیر استاتیک است و در متد استاتیک main صدا زده شده است و ما نمی‌توانیم یک متغیر یا متد غیر استاتیک را در یک متد استاتیک صدا بزنیم.


•    برای صدا زدن عضو غیر استاتیک number در متد استاتیک main باید از کلاسمون شی ایجاد کنیم و با شی ایجاد شده متغیر number که غیر استاتیک است را صدا بزنیم:

 

package www.javapro.ir;

public class Test1 {

    public int number; // instance variable

   public static void main(String[] args) {
   Test1 t=new Test1();
        t.number = 10;    
        System.out.println(t.number);
   }

}

 

خروجی: برنامه صحیح و بدون خطای کامپایل است.

 

10


•    راه حل دیگر این است که متغیر یا متد کلاسمون را از نوع استاتیک تعریف کنیم و از آن در متدهای استاتیک خود نظیر متد main استفاده کنیم،البته همه این دو روش بستگی به هدف شما در ساخت برنامه مورد نظرتون دارد:

 

package www.javapro.ir;

public class Test1 {

    public static int number; // static variable

   public static void main(String[] args) {
   
   number = 10;    
        System.out.println(number);
   }

}


خروجی: برنامه صحیح و بدون خطای کامپایل است.

 

package www.javapro.ir;

public class Test1 {

   // instance method:
   public int sum(int a, int b) {
       return a + b;
   }

   public static void main(String[] args) {

       int a = 399;
       int b = 256;

       int c = sum(a, b); // compile error

       System.out.println(c);
   }

}


•    در این قطعه کد بالا یک متغیر استاتیک با نام number در بدنه کلاس تعریف کرده و ان را در بدنه متد استاتیک main صدا زده ایم.

خب تا اینجا برای صدا زدن متغیر نمونه غیر استاتیک یک کلاس در یک متد استاتیک و خطای کامپایل پیش آمده و رفع خطای آن بایکدیگر گفتگو کردیم.حالا قصد داریم این مسئله رو برای استفاده از متدهای غیراستاتیک در متدهای استاتیک یک کلاس بررسی کنیم:

 

مثال: به قطعه کد زیر توجه کنید:

 

 

package www.javapro.ir;

public class Test1 {

   // instance method:
   public int sum(int a, int b) {
       return a + b;
   }

   public static void main(String[] args) {

       int a = 399;
       int b = 256;

       int c = sum(a, b); // compile error

       System.out.println(c);
   }

}

 

خروجی: خطای کامپایل می‌دهید و اگر برنامه را run کنیم با خطای زیر روبرو می‌شویم:

 

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
   Cannot make a static reference to the non-static method sum(int, int) from the type Test1

   at www.javapro.ir.Test1.main(Test1.java:16)

 

توضیحات:
•    در کد بالا متد sum در بدنه کلاس Test1 غیراستاتیک تعریف شده است و آن را در بدنه متد استاتیک main صدا زده ایم،همان طور که گفتیم یک عضو غیر استاتیک کلاس را نمی‌توانیم در یک متد استاتیک صدا بزنیم و از آن استفاده کنیم،به همین علت برنامه خطای کامپایل داده است.


•    برای رفع خطای کامپایل رخ داده در برنامه بالا به صورت زیر عمل می‌کنیم:

 

package www.javapro.ir;

public class Test1 {

   // instance method:
   public int sum(int a, int b) {
       return a + b;
   }

   public static void main(String[] args) {

       int a = 399;
       int b = 256;
       Test1 t = new Test1();
       int c = t.sum(a, b);

       System.out.println(c);
   }

}

 

خروجی:

 

655

 


آموزش استاتیک در جاوا

 

 

توضیحات:
•    به دلیل این که متد sum غیر استایک است برای صدا زدن آن در متد استاتیک main ابتدا از کلاس Test1 شی ساخته و از طریق شی ایجاد شده متد sum را صدا زده ایم.


•    شیوه دیگر استفاده متد sum در متد استاتیک main این است که متد sum را از نوع استاتیک تعریف کنیم:

 

package www.javapro.ir;

public class Test1 {

   // static method:
   public static int sum(int a, int b) {
       return a + b;
   }

   public static void main(String[] args) {

       int a = 399;
       int b = 256;

       int c = sum(a, b);

       System.out.println(c);
   }

}

 

خروجی:

 

655


توضیحات:
•    به دلیل این که متد sum استاتیک است می‌توانیم بدون شی ساختن از کلاس Test1 آن را در متد استاتیک main صدا بزنیم.

خب ما اینجا تمامی مثال هامون پیرامون متد استاتیک main کلاسمون بود در حالی که صدا زدن عضو غیر استاتیک در هر متد استاتیکی خطای کامپایل میده به مثال زیر توجه کنید:

 

package www.javapro.ir;

public class Test1 {

   int a = 50; // instance variable
   int b = 60;
   int sum;

   // static method:
   public static void get(int c, int d) {
       a = c;
       b = d;

       printSum();
   }

   public void printSum() {// instance method:
       sum = a + b;
       System.out.println(sum);
   }

   public static void main(String[] args) {
       get(90, 90);

   }

}

 

خروجی: خطای کامپایل می‌دهد، چرا؟ به دلیل این که متغیرهای a وb و متد printSum و که غیراستاتیک هستند در متد استاتیک get صدا زده شده اند. دو راه حل برای برطرف کردن خطای کامپایل بالا موجود است:


راه اول: متغیرهای a و b و متد printSum و به تبع آن متغیر sum را را از نوع استاتیک تعریف کنیم،چرا متغیر sum را باید استاتیک تعریف کنیم؟ زیرا قرار است متد printSum را استاتیک تعریف کنیم و از جهتی قرار است متغیر sum درون متد printSum صدا بزنیم پس باید sum را از نوع استاتیک تعریفش کنیم.برای درک بهتر برا خودتون تمرین کنید مثلا متد printSum را استاتیک کنید و متغیر sum را درونش صدا بزنید و همین طور برا خودتون آزمون و خطا کنید که یادبگیرید دلیلش چیه 😊

 

package www.javapro.ir;

public class Test1 {

   static int a = 50;
   static int b = 60;
   static int sum;

   public static void get(int c, int d) {
       a = c;
       b = d;

       printSum();
   }

   public static void printSum() {
       sum = a + b;
       System.out.println(sum);
   }

   public static void main(String[] args) {
       get(90, 90);

   }

}


خروجی:

 

180


راه حل دوم: با ایجاد شی از کلاس Test1، متغیرهای غیراستاتیک a و b و متد غیراستاتیک printSum را در درون متد استاتیک get صدا میزنیم.

 

package www.javapro.ir;

public class Test1 {

   int a = 50; // instance variable
   int b = 60;
   int sum;

   // static method:
   public static void get(int c, int d) {
       Test1 t = new Test1();
       t.a = c;
       t.b = d;

       t.printSum();
   }

   public void printSum() {// instance method:
       sum = a + b;
       System.out.println(sum);
   }

   public static void main(String[] args) {
       get(90, 90);

   }

}


خروجی:

 

180


هر چند که امروزه این اشتباه توسط IDE های امروزی تشخیص داده می‌شود و به برنامه نویس هشدار می‌دهد اما خب یکی از اشتباهات متداول و زیادی بود که توسط برنامه نویسان جاوا ممکنه است رخ دهد.

 

قصد داریم در سلسله آموزش هایی نکات کاربردی،خطاها و اشتباهات یا به زبان ساده گیرهایی که ممکنه در هنگام کدزدن به زبان جاوا براتون پیش بیاد را بررسی کنیم،پس با ما همراه باشید و به سایت جاواپرو سربزنید.

 

نظرات شما بسیار برای ما مهم است ،لطفا در نظرتون رو در مورد این آموزش جاوا برای ما ارسال کنید.


دوست من آرزوی سعادت و کامیابی رو برات دارم،خدانگهدار


این جلسه آموزشی را می‌توانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)

 

 

کانال تلگرام آموزش جاوا

 

 

دانلود رایگان کتاب اموزش زبان برنامه نویسی جاوا

لینک دانلود کتاب

 

 


نشر این مطلب با ذکر منبع (لینک سایت) بلامانع است.
برای با خبر شدن از جدیدترین مطالب آموزشی جاوا
عضو کانال تلگرام ما شوید.

نظرات کاربران
*نام و نام خانوادگی
* پست الکترونیک
* متن پیام

بستن
*نام و نام خانوادگی
* پست الکترونیک
* متن پیام

1 نظر
ahmad
چهارشنبه دوم بهمن ۹۸
پاسخ
()
()
ahmad
سلام مرسي از زحماتتون آموزش ها خيلي خوب و قابل فهم است هفته ديگه امتحان جاوا دارم .
پاسخ مدیر سایت
سلام.مرسی احمد جان! ان شاالله در امتحانت خوب شی
پاسخ مدیر سایت
هدر سایت
مشاهده سرفصل ها و ثبت نام در دوره Spring Boot جاواپرو  [کلیک کنید]
آموزش پروژه محور اسپرینگ بوت(Spring Boot)-سیستم دانشگاه
ثبت نام در دوره آموزش Spring security
دوره پرتاب | آموزش پیش نیازهای برنامه نویسی
دوره آموزش مبانی زبان برنامه نویسی جاوا
دوره آموزش مفاهیم پیشرفته زبان برنامه نویسی جاوا
مقدمه ای از زبان برنامه نویسی جاوا(java)
آموزش زبان برنامه نویسی جاوا
آموزش گرافیک در زبان برنامه نویسی جاوا
آموزش مدیریت چیدمان گرافیکی در زبان جاوا
آموزش ساخت بازی دوبعدی در زبان جاوا
Collection ها در زبان برنامه نویسی جاوا
آموزش پروژه محور ساخت برنامه مدیریت بانک با JavaFX
نمونه پروژه های رایگان زبان جاوا
آموزش دیتابیس در زبان برنامه نویسی جاوا
نمونه مثال پایه ای زبان برنامه نویسی جاوا
نمونه مثال String در زبان برنامه نویسی جاوا
آموزش جامع برنامه نویسی JavaFX
آموزش ساخت برنامه آزمون تستی در JavaFX
آموزش برنامه نویسی سوکت در جاوا
آموزش ساخت برنامه دفترچه تلفن با JavaFX
آموزش ساخت ربات ساده تلگرام با زبان جاوا
آموزش ساخت برنامه ماشین حساب با JavaFX
آموزش ساخت برنامه ساده مدیریت ایمیل ها با JavaFX
دوره آموزش Spring Boot
سفارش انجام پروژه زبان برنامه نویسی جاوا(JAVA)
سفارش انجام پروژه برنامه نویسی متلب(MATLAB) با قیمت منصفانه و تحویل به موقع
سفارش انجام پروژه زبان برنامه نویسی سی شارپ (#C)
سفارش انجام پروژه زبان برنامه نویسی سی(C)
سفارش انجام پروژه زبان برنامه نویسی پایتون(Python)
سفارش انجام پروژه زبان برنامه نویسی PHP (پی اچ پی)
سفارش انجام پروژه زبان برنامه نویسی اسمبلی(Assembly)
سفارش انجام پروژه زبان برنامه نویسی جاوا اسکریپت (Javascript)
سفارش انجام پروژه هوش مصنوعی
سفارش انجام پروژه طراحی الگوریتم
سفارش انجام پروژه ساختمان داده ها
سفارش انجام پروژه مهندسی نرم افزار
سفارش انجام پروژه شبکه های کامپیوتری
سفارش انجام پروژه پایگاه داده: دیتابیس (database)
 سفارش انجام پروژه سیستم عامل
سفارش انجام پروژه پاورپوینت(PowerPoint)
سفارش انجام پروژه اکسل (Excel)
سفارش انجام تحقیق و تهیه مقاله
سوالات متداول برنامه نویسی
جدیدترین مطالب
گفتگو را شروع کنید
مشاوره ،تدریس خصوصی و سفارش انجام انواع پروژه های برنامه نویسی