الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

عمل برنامج اوكلاس بدونmain methodفى الجافا

مغلق
بدأه m2ohabd في 9 أغسطس 2005 · 14 رد · 1,169 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

يا خبراء الجافا نحن نعرف ان اي برنامج او كلاس لازم يبقى فيه main method واحدة علشان يبدأ منها البرنامج فهل توجد طريقة لتشغيل البرنامج من غير ما اكتب ال main method وللعلم انا لا اتحدث عن ال applet ؟

اجابة السؤال هو نعم توجد طريقة ولا اعلم هل توجد طريقة اخرى ؟

الكود هو:

class WithoutMain

{

static

{

System.out.println("this program is running without main method");

}

}

ارجو ان تعم الفائدة

رجاء اخير ان تدعوا لوالدتي بالشفاء بظهر الغيب

السلام عليكم ورحمة الله

#2

غريبة هذه الطريقة

static 
{}

ولكن لازم يكن لها تفسير.

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#3

أخي العزيز.....

باختصار...

هذه تسمى الكتلة الساكنة (static block) ووظيفتها التمهيد إلى متغيرات ساكنة أو التمهيد إلى الصفوف وليس الاستعاضة عن الطريقة main في كتابة البرامج!!!....

للمزيد راجع الرابط:

http://www.developer.com/java/other/article.php/3065621

بالتوفيق

#4

شكرا على المعلومة الرائعة

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#5

برنامجك يرمي خطأ لأنه لا يوجد main.

أولا يحمل JVM أو البيئة التخلية فئتك التي سيميتها WithoutMain. وينادي على static Block ولا يفعل سوى طباعة كلام، وبعد هذا يبحث عن main ولا يجد هذا لتشغيل البرنامج!

كل فئة تحمل إلى JVM يتم مناداة القطعة الثابتة static block! بمعنى آخر لو عندك برنامج يستعمل 6 فئات، فسوف ينادي الJVM أوامر ستة قطع ثابتة في كل فئة!

كما قال أخي (العالمي) هذا لا يستعاض به main!

هذا مثال لاستخدام هذه الخاصية:

فئة Bubble تنشئ من خلالها بالونات،، لكنك لن تستطيع إنشاء بالونا جديدا بعد مرور دقيقة كاملة على وقت بداية افتتاح السوق!!!

import java.io.*;
public class StaticConstructorTest{
	static BufferedReader input;

	public static void main(String []args)throws IOException{
  System.out.println ("Assalam Alycome: Openning Market");
  input=new BufferedReader(new InputStreamReader(System.in));
  Bubble bubble=null;

  System.out.println ("The market will be open for 60 sec when you press Enter!");
  System.out.println ("The class will be loaded after the first Access to the class.");
  System.out.println ("Specifically after calling the next operation");
  System.out.println ("Press Enter to continue");
  input.readLine();
  System.out.println ("Bubble class loaded at "+Bubble.getClassLoadedTime());
  System.out.println ("the class is loaded after calling Bubble.getClassLoadedTime()");
  while(true){
 	 try{
    switch(getChoice()){
   	 case 1:
      bubble=new Bubble();
      System.out.println ("New Bubble Created...");
      break;

   	 case 2:
      if(bubble!=null)bubble.pop();
      else System.out.println ("It is null");
      break;
   	 case 3:
      System.out.println ("Fee Aman Allah!");
      System.exit(0);

    }
 	 }catch(MarketClosedException ex){

    System.out.println ("Market Closed. I suggest running the program again"+
      "\nbecasue the Market is closed."+
      "You still can pop Bubbles, or just Exit the program.");
 	 }
  }
	}

	public static int getChoice()throws IOException{
  System.out.println ();
  System.out.println ("Remainging Time for market to close: "+Bubble.getRemainingTime()/1000);
  System.out.println ("1- create Bubble");
  System.out.println ("2- Pop Last created Bubble");
  System.out.println ("3- Exit");
  int choice=0;
  while(choice==0){
 	 try {
    System.out.println ("Plaese Enter a valid Value:");
    int c=Integer.parseInt(input.readLine());
    if(c>0&&c<4)choice = c;
      }
      catch (Exception ex) {
     	 ex.printStackTrace();
     	 System.out.println ("Try again");
      }
  }
  return choice;
	}

}
class MarketClosedException extends Exception{}


class Bubble{
	private static long classLoadingTime;
	private static final long TIME=1000*60; // 1 minute for market!!
	boolean hasAir;
	/*static constructor: is used to initialize the Class
  *it is called whenever the class is loaded from the ClassLoader
  */
	static {
  classLoadingTime=System.currentTimeMillis();
	}
	/**You can create Bubbles for 1 minitue, after one minute you
  *dont have the ability to create more!!!
  */
	public Bubble()throws MarketClosedException{
  if(System.currentTimeMillis()-classLoadingTime>TIME){
 	 throw new MarketClosedException();
  }
  hasAir=true;
	}
	public void pop(){
  if(hasAir)System.out.println ("Bang");
  else System.out.println ("Fish Fish!!");
  hasAir=false;

	}
	public static long getClassLoadedTime(){return classLoadingTime;}
	public static long getRemainingTime(){
  long time= TIME - (System.currentTimeMillis()-getClassLoadedTime());
  if(time <0)return 0; else return time;
	}

}

بالتوفيق!!

#6

ولكن الخطأ لايظهر الا بعد تنفيذ static Blocks وهذا يعني انه يمكن بدء البرنامج من خلال static blocks .

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#7

الـ static غرضها هو الـ initialization فقط ..

نفس الطريقة ممكنة في سي بلص بلص .. عن طريق الـ constructor

#include <iostream>
using namespace std;

class Cheat
{
public:
    Cheat()
    {
        cout << "execute me!" << endl;
    }
};

Cheat c1

int main()
{
}

الـ main فارغ .. و لكن الكود في الـ constructor تنفذ قبل الـ main لأن الكائن c1 تم انشائه قبل الـ main

الفرق في السي بلص بلص انه بدون main فإن البرنامج لم ينفذ اصلا .. و لكن الجافا ربما لانها ديناميكية ستقوم بتنفيذ البرنامج حتى تكتشف عدم وجود الـ main

#8

من الغباء أن تجعل برنامجك يتنفذ في قطعة ثابتة،،، خذ هذا المثال:

هذا برنامجنا الأول وظيفته يطلب من المستخدم حجم كرتين مختلفتين ثم يركلهما بقوة!:

import java.io.*;
public class Ball{
	double size=0;
	static BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
	public Ball(double s){
  size=s;
	}
	public void kick(double power){
  System.out.println ("Boing: "+(power*size));
	}
	public static void main(String []args)throws IOException{
  System.out.print ("Please enter size of Ball 1: ");
  int size1 = Integer.parseInt(input.readLine());
  System.out.print ("Please enter size of Ball 2: ");
  int size2 = Integer.parseInt(input.readLine());
  Ball ball1= new Ball(size1);
  Ball ball2= new Ball(size2);
  System.out.print ("Please enter Kick power of Ball 1: ");
  int power1 = Integer.parseInt(input.readLine());
  System.out.print ("Please enter Kick power of Ball 2: ");
  int power2 = Integer.parseInt(input.readLine());
  ball1.kick(power1);
  ball2.kick(power2);
  System.out.println ("Exiting Program!!!");
	}

}

البرنامج السابق طبيعي جدا!!

الآن انظر إلى البرنامج التالي: عبارة عن كرة سلة (ترث من الفئة السابقة) وصنعنا برنامجا خاصا بذلك:

البرنامج يطلب من المستخدم 1- حجم كرة عادية 2- قوة ضربة الكرة العادية 3- قوة ضربة كرة سلة مصنوعة سابقا! ثم يركل الكرتين!

public class BasketBall extends Ball{

	public BasketBall(){
  super(40);
	}
	public void kick(double p){
  System.out.println ("Boing: "+size*p*2);
	}
	public static void main(String []args)throws java.io.IOException{
  BasketBall basket=new BasketBall();
  System.out.print ("Please enter size of Ball 1: ");
  int size1 = Integer.parseInt(input.readLine());
  Ball ball1= new Ball(size1);
  System.out.print ("Created Ball1... we created also a basket ball!!");
  System.out.print ("Please enter Kick power of Ball 1: ");
  int power1 = Integer.parseInt(input.readLine());
  System.out.print ("Please enter Kick power of BasketBall 2: ");
  int power2 = Integer.parseInt(input.readLine());
  ball1.kick(power1);
  basket.kick(power2);
  System.out.println ("Exiting Program!!!");
	}
}

حتى الآن كل شيء طبيعي جدا جدا....

الآن.... لننقل البرنامج الأول من main إلى قطعة ثابتة static block!! نحصل على هذه الشفرة:

import java.io.*;
public class Ball{
	double size=0;
	static BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
	static{
  try {
 	 System.out.print ("Please enter size of Ball 1: ");
 	 int size1 = Integer.parseInt(input.readLine());
 	 System.out.print ("Please enter size of Ball 2: ");
 	 int size2 = Integer.parseInt(input.readLine());
 	 Ball ball1= new Ball(size1);
 	 Ball ball2= new Ball(size2);
 	 System.out.print ("Please enter Kick power of Ball 1: ");
 	 int power1 = Integer.parseInt(input.readLine());
 	 System.out.print ("Please enter Kick power of Ball 2: ");
 	 int power2 = Integer.parseInt(input.readLine());
 	 ball1.kick(power1);
 	 ball2.kick(power2);
 	 System.out.println ("Exiting Program!!!");

     }
     catch (Exception ex) {
     }
	}

	public Ball(double s){
  size=s;
	}
	public void kick(double power){
  System.out.println ("Boing: "+(power*size));
	}
	public static void main(String []args)throws IOException{
  //do nothing
	}

}

كما تلاحظون.... أن البرنامج يعمل بصورة طبيعية كما في الشفرة الأولى Ball.

لكن شغلوا البرنامج الثاني BasketBall الآن.... ماذا ترون؟!!!!!!

سترى البرنامج الأول يعمل أولا وبعد انتهائه سيعمل الثاني!!! عجيب!!!!!!،، أنا أريد فقط تشغيل البرنامج الثاني main.... بمعنى آخر غباء في غباء!!!

لن أشرح أكثر من هذا... لكن المعنى واضح، أن static Block سينفذ أول ما يحمل فئة Ball لأنها أبو BasketBall!! وبعد هذا سينفذ main basketball!!

.... بالمناسبة تخيل معي هذا التصميم... كلنا استخدمنا JFrame... تخيل لو أن فئة Frame تحوي أمر main وبه برنامج يقوم بتجربة الفئة JFrame ، الاختبار عبارة عن إنشاء Frame جديد وإظهاره وتغيير حجمه وبعد هذا إخفاؤه.... ماذا سيحدث لبرامجنا التي استعملنا فيها JFrame.......

..

..

لن يحدث شيء،، لأن main في JFrame لا نناديها ولا يتم مناداتها في برنامجنا أبدا!! لكن تخيل لو أن الاختبار وضعوه في static block، ماذا سيحدث في برنامجنا؟؟؟

عجب عجاب.. كلما بدأ برنامجنا واستعملنا JFrame مثلا عند كتابتنا super("JFrame Title); مثلا أو أي أمر يتعلق ب JFrame... ستظهر مرة واحدة فقط الاختبار العجيب!! برنامج يعمل في وسط برنامج،، لن أطيل الشرح.. أظن الصورة وضحت!!

أرجو أن يكون هذا مفيدا!!

تم تعديل هذه المشاركة بواسطة أبومازن في 10 أغسطس 2005 في 20:47

#9

بالمناسبة،، كل البرامج بما فيها البريمجات تبدأ بـ main، قد تسأل عن البريمجات فأقول لك أن المتصفح هو الذي يشغل البرنامج هكذا:

public class AppletRunner{

public static void main(String[]args){
Class appletClass = Class.forName(args[0]);
Applet applet = appletClass.newInstance();

applet.init();
applet.start();

}
}

اجتهاد!!!!

بالتوفيق!!

#10

السلام عليكم ورحمة الله

اولا انا مستغرب جدا من طريقة رد الأخ ابو مازن وانفعاله الواضح من كتابته!!!

ثانيا انا اقدر خبرة الاخ ابو مازن الكبيرة فى الجافا ولكن دي معلومة جديدة عرفتها عن طريق صديق لي فى الولايات المتحدة يعمل java programmer فى شركة العاب كبرى وعلى العموم انا اسف اني اردت ان تعلموها معي لتعم الفائدة على المسلمين .

انا اعلم جيدا ان اي برنامج لازم توجد به Main method ليبدأ البرنامج منها ولكن هذه الطريقة اكيد لها استخدامات اخرى وانا شخصيا جربتها ولم تعطني اي errors .

على العموم انا اسف مرة اخرى اني اردت ان نتعرف سويا على هذه المعلومة ولا ابخل بها على احد.

#11

حتى أنا استغربت من كلمة (غباء) التي نطقت بها كثيرا!! آسف جدا.. لم أكن أقصد أحدا.... أرجو أن تتحملني،، وأعتذر منك مجددا ومن كل القراء عن هذا الأسلوب!

بالمناسبة لست خبيرا!!

#12

شكرا اخ أبو مازن. وصراحة معلومة مهمة جدا.

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#13

يا إخوان نحن نعلم أننا نحب الجافا لأن كل شيء فيها يحتوي على تفسير

والشذوذ فيها قليل فما التفسير البرمجي لهذه الظاهرة الجديدة

شكراً

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#14

عزيزي وهل هذا شذوذ؟ أم أن الشرح غير كافي؟ ألم تكف الوصلات والشرح السابق؟ إذا صعب عليك شيء فاسأل عنه...

ولا يوجد شذوذ أو شيء لا يفسر في أية لغة برمجة! وهذا ليس له دخل في حب الجافا :)!!

تحياتي!!

#15

يا أخ أبو مازن أعذرني إن لم أوضح

أنا أقصد كبرمجة شيئية

وشكراً

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…