26.04.2015 Views

دوسية جافا Java

دوسية جافا Java

دوسية جافا Java

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

تم تحميل الملف من موقع<br />

البوصلة التقنية<br />

www.boosla.com


1<br />

<br />

إعداد:‏ عبدا الله احمد أبو حسين<br />

موقع انترنت<br />

بريد الكتروني:‏ abdallah2nn@hotmail.com<br />

http://mail.alquds.edu/~s0111017 :


أولاً:‏ ماهي ال<strong>جافا</strong>؟<br />

OOP(Object Oriented Programming)<br />

و تعتمد هذه التقنية على<br />

ال<strong>جافا</strong> هي عبارة عن لغة برمجة تستخدم تقنية<br />

الأوبجكت و هو عبارة عن خواص(‏ و سلوك (behavior) مثلا لو اننا نريد عمل اوبجكت لضوء نحتاج لمعرفة ماذا<br />

نحتاج من خواص الضوء و سلوآه.‏<br />

الضوء<br />

الضوء->سلوك->يضيء<br />

و يجب تنزيله على نظام التشغيل لتشغيل<br />

تستخدم ال<strong>جافا</strong> آومبايلر و الإنتربتر و آلها تنضم في ال<br />

البرامج المكتوبة بلغة ال<strong>جافا</strong> ولذلك تعمل ال<strong>جافا</strong> على آل أنظمة التشغيل.‏<br />

<strong>Java</strong> Vertual Machine<br />

(states<br />

–> صفة->اللون<br />

ثانياً:قواعد أساسية في برمجة ال<strong>جافا</strong>:‏<br />

Functions<br />

يتكون برنامج ال<strong>جافا</strong> بشكل أساسي من :<br />

Methods و هي عبارة عن مجموعة من العمليات مكتوبة بلغة ال<strong>جافا</strong> تنفذ عند إستدعائها و يقابلها في لغة C ال<br />

و هناك أيضا ال Class و هو عبارة عن البرنامج المكتوب بلغة ال<strong>جافا</strong> و يحتوي على مكونات البرنامج<br />

.<br />

مثال:‏<br />

class Hello<strong>Java</strong>{<br />

public static void main(String[] args){<br />

System.out.println("<br />

}<br />

}<br />

‏;("مرحبا بك م في <strong>جافا</strong><br />

نستطيع آتابة أآتر من آلاس في البرنامج الواحد و لكن دائما هناك آلاس رئيسي يحتوي على الميثود الرئيسي (Main<br />

Method) و لا يحتوي أي من الكلاس على الميثود الرئيسي إلا الكلاس الرئيسي و للميثود الرئيسي اسم آخر حيث يسمى القائد<br />

. C لأنه إنطلاقاً‏ منه ينفذ البرنامج مثل في لغة (Driver Method)<br />

ملاحظة يجب أن يكون أول حرف من إسم الكلاس آبيراًو آل قسم منه يبدأ أيضا بحرف آبير لأن الإسم يكون متلاصق.‏ مثل :<br />

القسم الأول و القسم الثاني:‏<strong>Java</strong> بينما لاتبدأ أسماء الميثود بأحرف آبيرة و لكن تقون أقسامها الباقية<br />

تبدأ بأحرف آبيرة مثلا الميثود getMax القسم الأول get يبدأ بحرف صغير و لكن القسم الثاني Max يبدأ بحرف آبير و ذلك<br />

لفهم الإسم.‏<br />

Hello :<br />

:<br />

Hello<strong>Java</strong><br />

: System.out.println()<br />

: println<br />

: print<br />

يستخدم لطباعة الناتج حيث اذا استخدمنا:‏<br />

يطبع ثم ينزل سطر.‏<br />

يطبع بدون أن ينزل سطر.‏<br />

- أنواع المتغيرات المعرفة تلقائياً‏ في ال<strong>جافا</strong>(‏Types (Built in :<br />

هناك عدة أنواع معرفة للمتغيرات في ال<strong>جافا</strong> آبقية لغات البرمجة:‏<br />

يكون تعريف المتغير آالتالي:‏


إسم المتغير<br />

نوع المتغير<br />

char x مثال<br />

أنواع المتغيرات المعرفة في <strong>جافا</strong>:‏<br />

: ‏(الأعداد الحقيقية)‏Integers<br />

أآبر قيمة<br />

مدى الأرقام<br />

أقل قيمة<br />

الحجم<br />

‏(بيت)‏<br />

آيفية آتابته عند<br />

البرمجة<br />

Byte = 8 bits.<br />

long x = 1234321l ;<br />

ملاحظة:‏ عند تعريف<br />

long يجب آتابة<br />

l<br />

‏(حرف أل)بعد الرقم,‏ مثال:‏<br />

‏:(الأرقام العشرية)‏Floate<br />

المدى ( الحجم ‏(بيت<br />

آيفية الكتابة عند<br />

التعريف<br />

float 32 6<br />

-7 أرقام بعد الفاصلة<br />

15 رقم بعد الفاصلة double 64<br />

float x = 1.23f;<br />

Positive infinite : + ∞<br />

Negative infinite: ─ ∞<br />

Nan (not a number): 1/0 ( ).<br />

ملاحظة ‏:عند تعريف فلوت يجب آتابة f بعد الرقم,مثال:‏<br />

هناك آذلك للأرقام العشرية قيم خاصة مثل<br />

غير معرف<br />

:<br />

‏:(تعبير جبري له قيمتين صح او خطأ)‏ Boolean<br />

boolean Size : 1bit Values : true , false.<br />

مثال:‏


و أ<br />

boolean x = true;<br />

Characters:<br />

هي عبارة عن حرف واحد او رمز حجمه 2 بايت و يكون دائما تعريفه بوضع الحرف او الرمز بين<br />

بكتابة الرقم المقابل له بالأسكي آود و هي مجموعة الأرقام المعرفة للأحرف و الرموز.‏<br />

ملاحظة:‏ نستطيع الكتابة بأي لغة نريدها في ال<strong>جافا</strong> لأنها تستخدم<br />

مثال:‏<br />

' '<br />

char<br />

Size: 16bit<br />

Ascii code<br />

و اللغة الموحدة<br />

. Unicode<br />

char x = 'A'; char x = 65;<br />

‏;'س'=‏x char<br />

char x='#';<br />

65 يقابله الحرف A في الأسكي آود.‏<br />

هناك أيضا الرمز 'n\' و هذا يعني انزل سطر أو enter و يقابله في الأسكي آود رقم 13<br />

: ‏(المعاملات)‏ Operators<br />

+ , - , * , / , ++ , --<br />

int x =4; x++;<br />

ملاحظة<br />

مثال:‏<br />

++<br />

:<br />

النتيجة:‏ 5=x<br />

يعني تزيد للمتغير قيمة 1<br />

-- تنقص من قيمة المتغير قيمة 1<br />

‏:(علاقات)‏Relations<br />

تساوي و تستخدم عند السؤال : ==<br />

لا تساوي و تستخدم أيضا عند السؤال : =!<br />

أآبر من أو تساوي : =><br />

أقل من أو تساوي:=<br />

أصغر : ><br />

Boolean Operators:<br />

و تستخدم عند السؤال<br />

&& : and<br />

|| : or<br />

^^ : xor<br />

! : not<br />

Bitwise Operators:


و تستخدم في العمليات المنطقية<br />

&: and<br />

| : or<br />

^ : xor<br />

~ : not<br />

More Complicated :<br />

مثال:‏<br />

إزاحة الى اليمين : ><br />

باقي القسمة : %<br />

int x;<br />

x = 4%3;<br />

الخروج<br />

x= 1 :<br />

‏:(التحويل التلقائي)‏ Automatic Conversion<br />

تستطيع ال<strong>جافا</strong> نحويل شتى انواع المتغيرات في نتائج العمليات المختلفة الى نوع واحد حسب قوانين خاصة<br />

حسب الأحقية.‏<br />

مثال:‏<br />

1.7 + 99 = 100.7<br />

double + int = double<br />

ثم قام بالعملية int double<br />

النتيجة double<br />

حيث تكون الأولويات عند وجود انواع المتغيرات في العملية بالترتيب التالي:‏<br />

double<br />

float<br />

long<br />

و النتيجة تكون من نوع<br />

إذا آان في العملية double تحول المتغيرات الأخرى الى و النتيجة تكون من نوع<br />

إذا آان في العملية float تحول المتغيرات الأخرى الى و النتيجة تكون من نوع<br />

إذا آان في العملية long تحول المتغيرات الأخرى الى و النتيجة تكون من نوع<br />

إذا لم تكن في العملية أي من الانواع السابقة تحول آل المتغيرات الى .double<br />

. float<br />

.long<br />

.int<br />

int<br />

-1<br />

-2<br />

-3<br />

-4<br />

Casting:<br />

هي عملية ارجاع قيمة نحن نختارها بعد القيام بالعملية.‏


int x = 2345;<br />

short y = (short)x;<br />

مثال على :casting<br />

int حجمه short حجمه 2 بايت<br />

لذلك يأخذ لy 2 بايت من يمين x من القيمة الممثلة<br />

4 بايت و لكن<br />

بالذاآرة و اذا آانت هناك اشارة يأخذ بالإضافة لذلك الإشارة<br />

X<br />

الإشارة<br />

Y<br />

هي عبارة عن مجموعة من الأحرف<br />

الرموز بين آالتالي<br />

‏(رموز +<br />

:<br />

" "<br />

‏:(المتسلسلات)‏Strings<br />

أحرف)‏ تستخدم آقطعة واحدة و يكون تعريفها بوضع مجموعة<br />

يجب مراعاة أن يكون الحرف الأول آبير في هذا النوع حيث يكون حرف ال S آبير.‏<br />

String s = "<strong>Java</strong> 2";<br />

أو<br />

String s;<br />

‏;"<strong>جافا</strong>"‏ = s<br />

.<br />

ملاحظة:‏ يمكن استخدام عملية اضافة أحرف أو جمل للمتغيرات من نوع String<br />

String s = "<strong>Java</strong> ";<br />

int x=2;<br />

s+= "2"; أو s = s+"2"; أو s+= '2'; أو s+=x;<br />

مثال:‏<br />

الخروج:‏<br />

s="java 2"


public class Triangle{<br />

public static void main(String[] args){<br />

String s= "*";<br />

for (int i=0;i


public class Revers{<br />

public static void main(String[] args){<br />

String s = "<strong>Java</strong>";<br />

int length = s.length();<br />

for (int i=length;i>=0;i--)<br />

System.out.print(s.charAt(i));<br />

}<br />

}<br />

Flow Control:<br />

مثال برنامج يعمل قلب لكلمة:‏<br />

الخروج<br />

التكرار:‏<br />

avaj :<br />

آثير من الأحيان في ال<strong>جافا</strong> وتكاد جميع لغات البرامج تستخدم التكرار لتكرار عملية واحدة أآثر من مرة و في<br />

ال<strong>جافا</strong> آما في لغات البرمجة الأخرى أوامر لعمل تكرار للعمليات و هذه الأوامر:‏<br />

‏(تنفيذ عملية ; السؤال ; تعريف متغيرات مساعدة في السؤال في التكرار for( -1<br />

العملية المراد تكرارها<br />

‏(السؤال)‏while -2<br />

ا لعملية المراد تكرارها<br />

3- do{<br />

العمليات المراد تكرارها<br />

‏;(السؤال)‏while‏{‏<br />

السؤال:‏ نكتبه لعمل حد للتكرار حيث يكون اما صح او خطأ(‏false (true or حيث يبقى تكرار العملية ساريا<br />

حتى يصبح السؤال نتيجته خطأ مثلا:‏<br />

int x=0;<br />

for(int i = 0 ;i


int i=10,x=0;<br />

whil(i!=0){<br />

x++;<br />

i--;<br />

}<br />

مثال:‏<br />

( i-- و x++)<br />

: do while و while<br />

حيث ينفذ العمليتين التان داخل البلوك في التكرار while حتى تصبح i تساوي صفراً.‏<br />

الفرق بين التكرارين<br />

الفرق بسيط حيث ينفذ التكرار do while العمليات مرة واحدة على الأقل قبل أن يسأل السؤال.‏<br />

مثال:‏<br />

حيث ينفذ العملية 5=+x مرة على الأقل قبل السؤال.‏<br />

int x=0,i=1;<br />

do{<br />

x+=5;<br />

}while(i==0);<br />

الشرط:‏<br />

نستطيع في ال<strong>جافا</strong> استخدام شرط لتنفيذ عملية ما وهناك أمرين لعمل الشرط:‏<br />

و نستطيع وضع أي شرط مثل في عمليات التكرار و يكون اما صحيح أو خاطئ(‏Boolean‏).‏<br />

مثال:‏<br />

‏(الشرط)‏‎1-if<br />

العملية<br />

if ( i==5)<br />

x++;<br />

آما نستطيع حصرها ب {} لتنفيذ أآثر من عملية.‏<br />

نستطيع اتباعها ب else حيث اذا لم ينفذ العملية الأولى في الشرط ينفذ عملية اخرى.‏<br />

if(i==5)<br />

x++;<br />

else<br />

x+=2;<br />

if(i>=4)<br />

x++;<br />

else if(i>6)<br />

x*=6;<br />

مثال:‏<br />

اذا لم ينفذ ++x سينفذ 2=+x و نستطيع آذلك حصر else ب {} .<br />

أو اتباعها ب if(boolean) else حيث ان لم ينفذ الشرط الأول يجرب الشرط الثاني.‏<br />

مثال:‏


الأمر الثاني هو أمر المفتاح (switch) حيث نستطيع استخدام هذا المفتاح آالتالي:‏<br />

int x;<br />

switch(x){<br />

case 1:<br />

العملية<br />

break;<br />

case 2:<br />

العملية<br />

break;<br />

.<br />

.<br />

default:<br />

تنفيذ عملية عند عدم تحقق الخيارات السابقة<br />

break;<br />

}<br />

أوchar int<br />

x تساوي<br />

حيث نستطيع وضع مكان x في الأمر سويتش النوعين فقط مثلا في المثال السابق حيث وضعنا<br />

x من نوع int و يعمل الأمر آالتالي اذا آانت قيمة 1 ينفذ العملية التي تحت<br />

اذا لم تكن قيمة x موجودة في القيم الموضوعة للمفتاح ينفذ العملية الموجودة في<br />

يمكن عدم وضع الخيار<br />

ينتهي آل break حيث ينهي آافة العمليات التي داخل ال<br />

ملاحظة:‏ يمكن استخدام الأمر break في التكرار و ذالك لإنهاء عملية التكرار.‏<br />

case 1 و هكذا.‏<br />

. default<br />

. case<br />

X<br />

Case 1<br />

Case 2<br />

Case 3<br />

default<br />

.default<br />

case بالأمر<br />

while(x!=0){<br />

x++;<br />

if(x>0)<br />

break;<br />

}<br />

مثال:‏<br />

في هذا المثال يخرج من عملية التكرار اذا تنفذ شرط<br />

. if<br />

نستطيع في ال<strong>جافا</strong> تعريف مصفوفة حيث تمثل بالذاآرة آالتالي:‏<br />

أرقام الخانات و تستخدم لعمل عمليات مختلفة للقيم الموجودة في الخانات<br />

: ‏(المصفوفات)‏Arrays<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

أجزاء محجوزة في الذاآرة لها عناوين متسلسلة.‏


تحجز المصفوفات عناوين متسلسلة في الذاآرة و يكون حجم آل جزء بمقدار حجم النوع الذي عرفت به<br />

المصفوفة.‏<br />

مثال:‏<br />

int[] a = new int[10];<br />

int[] a = {1,3,5,2};<br />

هنا عرفنا المصفوفة بطريقتين الأولى عرفنا المصفوفة بأن بنينا مصفوفة جديدة من نوع int تحجز 10 خانات<br />

متسلسلة في الذاآرة و آل خانة لها حجم و لكن الخانات خالية ولا تحتوي على قيم,‏ اما في الثانية<br />

فعرفنا المصفوفة بأن وضعنا قيم لها حيث يحجز النظام خانات بعدد القيم الموضوعة و يكون حجمها من نوع<br />

int و آل خانة تحتوي على قيمة من القيم الموضوعة حسب التسلسل.‏<br />

ملاحظة الأمر new يعمل على بناء object حيث يحجز في الذاآرة مكان لأوبجكت جديد.‏<br />

(4byte) int<br />

:<br />

آيفية استخدام المصفوفة و اخذ القيم منها:‏<br />

نستطيع معرفة القيمة المخزنة في أي خانة أو تخزين قيمة جديدة في أي خانة او عمل عمليات على هذه الخانة<br />

عن طريق العنوان و هو رقم الخانة.‏<br />

مثال:‏<br />

int[] a = {1,3,5,6,2};<br />

int x=a[0];<br />

a[1]+=4;<br />

(index)<br />

في هذا المثال خزنا قيمة الخانة 0 في المتغير x حيث أصبحت قيمة<br />

و أضفنا للخانة<br />

نستطيع معرفة طول المصفوفة باستخدام الميثود<br />

int x;<br />

int[] e={2,5,3,7,1,9};<br />

x=e.length;<br />

x تساوي . 1<br />

1 القيمة 4 فأصبحت a[1] تساوي .7<br />

int length آالتالي:‏<br />

حيث قيمة x تساوي بعد العملية الأخيرة 6 و هو عدد الخانات المحجوزة للمصفوفة.‏<br />

مثال برنامج يوجد أصغر رقم موجود في المصفوفة:‏<br />

الخروج:‏<br />

Class Minimum{<br />

public static void main(String[] args){<br />

int[] a={3,8,4,9,1};<br />

int min = a[0];<br />

for(int i=0;i


إستخدام ال Method في برمجة <strong>جافا</strong>:‏<br />

نستطيع آتابة أآثر من ميثود غير الميثود الرئيسي في برنامج واحد و يتم استدعاء آل ميثود عند الحاجة من<br />

الميثود الرئيسي.‏<br />

مثال حساب أعلى قيمة موجودة في المصفوفة:‏<br />

class Maximum{<br />

ميثود لحساب اعلى قيمة}(‏a public static int getMax(int[]<br />

int max = a[0];<br />

for(int i=0;imin)<br />

max=a[i];<br />

}<br />

return max;<br />

}<br />

}<br />

هنا الميثود الرئيسي}(‏args public static void main(String[]<br />

int[] b={2,5,4,9,1,33};<br />

هنا نادينا الميثود;(‏max=getMax(b int<br />

System.out.println("the max number in the Array = "+max);<br />

}<br />

public static int getMax(int[] a)<br />

نوع المتغير او<br />

object لإرساله الى<br />

الميثود و هنا من نوع<br />

مصفوفة أعداد<br />

حقيقية(‏int‏)‏ و يسمى<br />

هذا الجزئ ‏:(المعامل)‏<br />

القيمة التي يرجعها<br />

الميثود و هنا من نوع<br />

int<br />

.parameter<br />

ملاحظة:‏ لايهم ترتيب الميثود في ال<strong>جافا</strong> حيث يمكن أن يكون الميثود الرئيسي في الآخر.‏<br />

يجب ان تكون الميثود التي هي خارج الأوبجكت من نوع static لنناديها آما في المثال السابق.‏<br />

: ‏(المصفوفات ذات الإتجاهين)‏Arrays 2D<br />

نستطيع تعريف مصفوفة ذات اتجاهين في ال<strong>جافا</strong> و تمثل في الذاآرة بنفس تمثيل المصفوفة ذات الإتجاه الواحد.‏<br />

مثال تعريف المصفوفة ذات الإتجاهين:‏<br />

int[][] a = new int[2][4];<br />

أوبوضع لها قيم<br />

int[][] a = {{1,2,4,7},{-1,5,8,9}};<br />

للوصول لقيمة خانة في المصفوفة نضع رقم الصف و رقم العامود المراد.‏


int[][] a= {{1,2,4,7},{-1,5,8,9}};<br />

int x = a[0][3];<br />

مثال:‏<br />

هنا أصبحت قيمة<br />

x تساوي .7<br />

1<br />

2<br />

4<br />

7<br />

-1<br />

5<br />

8<br />

9<br />

‏:(الملاحظات و التعليقات)‏Documentation Comments and<br />

هناك نوعين من التعليقات في ال<strong>جافا</strong> حيث تكتب هذه التعليقات أو الملاحظات لكي يستطيع المبرمجون الآخرون<br />

فهم ما آتبناه من ميثود أو لكي يستطيع المستخدم فهم البرنامج ولا تؤثر أبدا في عمل البرنامج و هذان النوعان<br />

هما:‏<br />

Comments :<br />

و تكتب بعد الإشارة // أو تحصر بين ‏/*......التعليق.....*/‏ و تكتب ليستطيع المبرمج قراءة البرنامج الذي<br />

آتبناه و فهمه.‏<br />

و تكتب بين ‏/*.......المساعدة........**/‏ والفائدة منها لجعل المستخدم يفهم ماذا يعمل البرنامج.‏<br />

ملاحظة:‏ هناك أدوات في <strong>جافا</strong> تستطيع قراءة التعليقات و عمل منها صفحة انترنت و تسمى<br />

مثال:‏<br />

Documentation:<br />

. javadoc<br />

/**class to print star<br />

@auther : Abdallah Ahmad<br />

@company : al quds university<br />

@version 1.0 */<br />

class star{<br />

public static void main(String[] args){<br />

}<br />

}<br />

System.out.print("*");<br />

//print star<br />

في ال<strong>جافا</strong> يجب آتابة التعليقات لأهميتها حيث في قوانين البرمجة بال<strong>جافا</strong> يجب مراعاة الترتيب و التنظيم<br />

للبرنامج و عدم استخدام side effect و يعني عدم آتابة أآثر من عملية في سطر واحد.‏<br />

i=23+22;b=13%67;<br />

side effect<br />

مثال:‏<br />

و الحكمة من ذلك معرفة موقع الخطأ بالضبط عند حصوله عند تنفيذ البرنامج لذلك يجب وضع آل عملية في<br />

سطر وحدها.‏<br />

آما يجب مراعاة الترتيب في حصر الميثود أو الأوامر أو الكلاس لتسهيل فهم البرنامج.‏


class star<br />

{<br />

| public static void main(String[] args)<br />

| {<br />

| | System.out.print("*");<br />

| }<br />

}<br />

مثال:‏<br />

ملاحظة:‏ تكتب ال Documentation دائما قبل الميثود و ال field و ال<br />

.Constructor<br />

ثالثاً:آيفية البرمجة بتقنية : OOP<br />

Fields:<br />

الفكرة:‏ ال object هو مجموعة من المعلومات.‏<br />

و هي عبارة عن المعلومات التي نحتاجها لعمل البرنامج و هي من صفات الأوبجكت مثلا لو أننا أردنا بناء<br />

أوبجكت للطالب نحتاج معلومات عن الطالب مثل اسمه و رقمه الجامعي و علامته.‏<br />

مثال:‏<br />

class Student{<br />

‏/*اسم الطالب و هو من نوعString‏**/‏<br />

public String name;<br />

/**double<br />

public double id;<br />

‏/*العلامة و هي من نوع /**int<br />

public int mark;<br />

‏/*الرقم ال جامعي و هو من نوع<br />

}<br />

Constructor:<br />

هو عبارة عن باني الأوبجكت عندما نحتاج بناء أوبجكت يجب علينا استخدامه حيث يعمل لنا أوبجكت جديد له<br />

صفات الأوبجكت الذي بني منه.‏<br />

يكون اسم ال Constructor نفس اسم الكلاس المعمول فيه.‏<br />

مثال:‏<br />

class Student{<br />

‏/*اسم الطالب و هو من نوعString‏**/‏<br />

public String name;<br />

‏/*الرقم الجامعي و هو من نوعdouble‏**/‏


}<br />

public double id;<br />

‏/*العلامة و هي من نوع /*int<br />

public int mark;<br />

/**Constructor of Student Object*/<br />

public Student(){<br />

}<br />

class StudentTest{<br />

public static void main(String[] args){<br />

Student abdallah = new Student();<br />

abdallah.name ="abdallah";<br />

abdallah.id = 20111017;<br />

abdallah.mark = 80;<br />

System.out.print(abdallah.name+abdallah.id+"["+abdallah.mark+"]");<br />

}<br />

}<br />

يمكن أن يكون ال Constructor مع باراميتر ويمكن آذالك أن يكون هناك أآثر من Constructor لأوبجكت<br />

واحد و يكون الأختلاف بعدد الباراميتر و تسمى هذه الحالة<br />

يسمى الConstructor الذي ليس له باراميتر الباني الإفتراضي(‏Constructor (Default حيث يعمل بناء<br />

للأوبجكت دون اعطاء قيم للFields و يكون دائما مكتوب.‏<br />

.Overloading<br />

class Student{<br />

‏/*اسم الطالب و هو من نوعString‏**/‏<br />

public String name;<br />

‏/*الرقم الجامعي و هو من نوعdouble‏**/‏<br />

public double id;<br />

‏/*العلامة و هي من نوع /*int<br />

public int mark;<br />

/**Default Constructor of Student Object*/<br />

public Student(){<br />

}<br />

مثال:‏<br />

/**Constructor of Student Object with parameter */<br />

public Student(String aName,double aId,int aMark){<br />

name = aName;<br />

id = aId;<br />

mark = aMark;<br />

}<br />

}<br />

class StudentTest{<br />

public static void main(String[] args){


}<br />

Student abdallah = new Student("abdallah",20111017,80);<br />

System.out.print(abdallah.name+ abdallah.id+"["+ abdallah.mark+"]");<br />

}<br />

في ال<strong>جافا</strong> الترآيز دائما على الأوبجكت حيث هو الذي يحتوي على المعلومات و الميثود المطلوبة لتعطينا نتائج<br />

هذه المعلومات.‏<br />

الميثود الرئيسي في ال<strong>جافا</strong> هو عبارة عن أوامر لتنفيذ الميثود التي داخل الأوبجكت فقط و لا تستخدم تقنية<br />

الفنكشن في ال<strong>جافا</strong> مثل في لغة . c<br />

Public / Private:<br />

Public:<br />

عند وضع آلمة public قبل الميثود أو الفيلد أو باني الأوبجكت نستطيع استخدامهم في أي آلاس آخر و في<br />

هذه الحالة يجب آتابة ال documentation لهذه الأشياء و ذلك يجعل امر تحديثها امرا صعبا لأن ممكن أي<br />

تحديث لها أن يغير مفهومها و بذلك يصبح التعليق الذي آتب عنها خاطئ فلا يعرف المستخدم ماذا تعمل هذه<br />

الأشياء بالضبط.‏<br />

Private:<br />

اذا آانت الأشياء السابقة(ميثود,فيلد,....)‏ private لا نستطيع استخدامها الا من الكلاس التي عرفت فيه و لا<br />

نحتاج لكتابة التعليق و بذلك يكون أمر تحديثها سهل و لذالك نستخدم دائما في الأوبجكت فيلد معرفة<br />

ميثود معرفة<br />

private و<br />

Accessor and Mutator:<br />

. public<br />

في الأوبجكت دائما هناك لكل فيلد معرف ميثودين و هما<br />

Accessor:<br />

:<br />

و يستخدم للوصول للقيمة المخزنة داخل هذا الفيلد و يبدأ دائما اسمه بكلمة get ويرجع قيمة الفيلد و هو بدون<br />

باراميتر.‏<br />

و يستخدم لتغيير قيمة فيلد معين و يبدأ دائما اسمه بكلمة set وله باراميتر و لكن لا يرجع قيمة<br />

Mutator:<br />

.<br />

مثال:‏<br />

class Student{<br />

private String name;<br />

private double id;<br />

private int mark;<br />

/**Default Constructor of Student Object*/<br />

public Student(){<br />

}<br />

/**Constructor of Student Object with parameter */


}<br />

public Student(String aName,double aId,int aMark){<br />

name = aName;<br />

id = aId;<br />

mark = aMark;<br />

}<br />

/**accessor to name*/<br />

public String getName(){<br />

return name;<br />

}<br />

/**mutator to name*/<br />

public void setName(String aName){<br />

name = aName;<br />

}<br />

/**accessor to Id*/<br />

public double getId(){<br />

return id<br />

}<br />

/**mutator to Id*/<br />

public void setId(double aId){<br />

id = aId;<br />

}<br />

/**accessor to Mark*/<br />

public int getMark(){<br />

return mark;<br />

}<br />

/**mutator to Mark */<br />

public void setMark(int aMark){<br />

mark = aMark;<br />

}<br />

class StudentTest{<br />

public static void main(String[] args){<br />

Student abdallah = new Student();<br />

abdallah.setName("abdallah ");<br />

abdallah.setId(20111017);<br />

abdallah.setMark(80);<br />

System.out.print(abdallah.getName()+abdallah.getId()+abdallah.getMar<br />

k());<br />

}<br />

}<br />

الخروج : 80 . abdallah 20111017<br />

ملاحظة:‏ عند وضع آلمة void قبل الميثود هذا يعني أنه لا يرجع قيمة.‏


toString Mithod:<br />

هو عبارة عن ميثود يرجع لنا معلومات عن الأوبجكت و القيمة التي يرجعها من نوع .String<br />

عند بناء الأوبجكت يكون موجود هذا الميثود افتراضيا و لكن عند مناداته يرجع لنا عنوان في الذاآرة و لذلك<br />

نحتاج دائما لإعادة آتابته.‏<br />

class Student{<br />

private String name;<br />

private double id;<br />

private int mark;<br />

/**Default Constructor of Student Object*/<br />

public Student(){<br />

}<br />

/**Constructor of Student Object with parameter */<br />

public Student(String aName,double aId,int aMark){<br />

name = aName;<br />

id = aId;<br />

mark = aMark;<br />

}<br />

/**accessor*/<br />

public String getName(){<br />

return name;<br />

}<br />

/**mutator*/<br />

public void setName(String aName){<br />

name = aName;<br />

}<br />

/**accessor*/<br />

public double getId(){<br />

return id<br />

}<br />

/**mutator*/<br />

public void setId(double aId){<br />

id = aId;<br />

}<br />

/**accessor*/<br />

public int getMark(){<br />

return mark;<br />

}<br />

/**mutator*/<br />

public void setMark(int aMark){<br />

mark = aMark;<br />

}


**toString Method*/<br />

public String toString(){<br />

return "Name"+name+","+"ID:"+id+","+"MARK:"+mark;<br />

}<br />

}<br />

class StudentTest{<br />

public static void main(String[] args){<br />

Student abdallah = new Student("abdallah ",20111017,80);<br />

System.out.print(abdallah.toString());<br />

}<br />

}<br />

Name: abdallah, ID: 20111017 , MARK: 80<br />

abdallah فقط abdallah.toString<br />

toString تلقائياً‏ .<br />

الخروج:‏<br />

اذا آتبنا في أمر الطباعة بدل<br />

مثال:‏<br />

أي اسم الأوبجكت يستخدم الميثود<br />

System.out.print(abdallah);<br />

:<br />

System.out.print(abdallah.toString());<br />

Name: abdallah, ID: 20111017 , MARK: 80<br />

هي نفسها<br />

الخروج:‏<br />

ملاحظة:اذا آان الفيلد من نوع static فتكون قيمته ثابتة لكل الأوبجكت المعرفة من نفس الكلاس و لكن يمكن<br />

تغيير قيمته عند الحاجة.‏<br />

مثال:‏<br />

class Student{<br />

private String name;<br />

private double id;<br />

private int mark;<br />

private static int nextId=5;<br />

.<br />

.<br />

.<br />

}<br />

class StudentTest{<br />

public static void main(String[] args){<br />

Student abdallah = new Student("abdallah ",20111017,80);<br />

Student hamzeh = new Student("hamzeh",20111159,80);<br />

System.out.print(abdallah.getNextId()+" , "hamzeh.getNextId());<br />

}<br />

}<br />

: ‏(الثابت)‏Constant<br />

الخروج:‏ .5 , 5


نستطيع تعريف فيلد ثابت القيمة لا يمكن تغيير قيمته في البرنامج و انما يستخدم آثابت و ذلك باستخدام الكلمة<br />

المعرفة<br />

مثال:‏<br />

.final<br />

class StudentTest{<br />

public static final String a="NAME : ";<br />

public static void main(String[] args){<br />

Student abdallah = new Student("abdallah ",20111017,80);<br />

Student hamzeh = new Student("hamzeh",20111159,80);<br />

System.out.print(a+ abdallah.getName());<br />

}<br />

}<br />

الخروج:‏ .NAME : abdallah<br />

تمثيل الأوبجكت في الذاآرة:‏<br />

يمكن رسم رسم تمثيلي للأوبجكت في الذاآرة مثلا لرسم الأوبجكت abdallah في المثال السابق:‏<br />

Student abdallah<br />

Student<br />

String name<br />

double id=20111017<br />

int mark=80<br />

String<br />

"<br />

abdallah<br />

"<br />

ملاحظة : ال String هو عبارة عن أوبجكت لذلك رسمنا سهم من اللإسم الى الأوبجكت . String<br />

Input and Output:<br />

في ال<strong>جافا</strong> أدوات الإدخال و الإخراج تسمى مجرى(‏Stream‏)‏ حيث يتم استقبال المعلومات المدخلة عن طريق<br />

مجرى آالتالي:‏<br />

Buffered<br />

Reader<br />

Input Stream<br />

Reader<br />

System in<br />

input<br />

القرائة من لوحة المفاتيح:‏<br />

للقرائةمن لوحة المفاتيح نحتاج<br />

3 أنابيب(‏Stream (3<br />

آما في الصورة التي في الأعلى و هم:‏


و هو الأنبوب الأول و يعمل على قرائة بايت واحد في آل مرة.‏<br />

مثال:‏<br />

System in:<br />

Input Strem Reader:<br />

و يعمل على تحويل آل 2 بايت الى حرف أو رمز.‏<br />

Buffered Reader:<br />

و يعمل على تجميع هذه الحروف أو الرموز في ذاآرة مؤقتة لعمل منها سلسلة(‏String‏).‏<br />

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br />

BufferedReader<br />

و الكلاس<br />

هنا القارئ in هو من نوع الكلاس<br />

المعامل(‏parametr‏)‏ InputStremReader و الكلاس InputStreamReader له المعامل<br />

هو آلاس للقرائة بايت من لوحة المفاتيح.‏<br />

و هي مع بعضها آما في المثال تمثل مجرى لقرائة حرف أو سلسلة من الأحرف من لوحة المفاتيح.‏<br />

BufferedReader له<br />

System.in و<br />

Try And Catch:<br />

ملاحظة : in هو مجرد اسم يمكن تغييره.‏<br />

:<br />

عند عمليات القرائة و الكتابة في ال<strong>جافا</strong> تحصر أوامر القرائة و الكتابة بين الكلمتين try و catch و تعني جرب<br />

القراءة أو الكتابة و اذا لم تنجح فأمسك الخطأ الذي تسبب في عدم النجاح في العملية , و الأخطاء تسمى<br />

"Exception" و هناك أنواع عديدة مثل IOException و تعني خطأ في اجهزة الدخول و الخروج أو مثلا<br />

الى رقم(..…,‏int,long‏).‏ String و هي أخطاء التحويل من NumberFormatException<br />

مثال:‏<br />

try{<br />

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br />

يقرأ سطر من لوحة المفاتيح//‏ in.readLine(); String s =<br />

}catch(Exception e){<br />

‏......ماذا نريد أن يفعل إذا آان هناك خطأ في العملية .......<br />

e هي خطأ عام أي لم نحدد أي نوع من الأخطاء يجب أن يمسك البرنامج.‏<br />

هو اسم يمكن تغييره.‏<br />

نستطيع طباعة الخطأ على الشاشة هكذا:‏<br />

}<br />

try{<br />

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br />

String s = in.readLine();<br />

}catch(Exception e){<br />

System.out.print(e);<br />

e<br />

يطبع لنا الخطأ بالضبط //<br />

ملاحظة:‏ يتم تعريف القارئ مرة واحدة في الكلاس<br />

في الكلاس.‏<br />

}<br />

,<br />

مثلا في المثال السابق القارئ in يتم تعريفه مرة واحدة


القرائة من ملف:‏<br />

نستطيع القرائة في ال<strong>جافا</strong> من ملف نصي file) (text عن طريق الكلاس FileReaderحيث يكون تعريف<br />

القارئ آالتالي:‏<br />

المعامل<br />

مثلا:‏<br />

BufferedReader r = new BufferedReader(new FileReader("c:\myFile.txt"));<br />

(parameter)<br />

مثال برنامج يعد الأسطر في ملف:‏<br />

للكلاس FileReader هو عبارة عن سلسلة و تعبر عن المسار الذي موجود فيه الملف<br />

‏"‏txt‏.ملفي\‏c:\myDocument\doc‏"‏<br />

class CountFileLine{<br />

public static void main(String[] args){<br />

try{<br />

BufferedReader r = new BufferedReader(new FileReader("c:\myFile.txt"));<br />

String s;<br />

int count=0;<br />

متغيرلحساب الأسطر و هو من نوع //int<br />

يقرأ سطر سطر حتى نهاية الملف // r.readLine())!=null) while((s =<br />

count++;<br />

r.close();<br />

System.out.print("The Number Of line in this file is : "+count);<br />

}catch(Exception ee){<br />

System.out.print("error when reading file : \n"+ee);<br />

}<br />

لإغلاق الملف//‏<br />

ملاحظة:‏ null هي آلمة معرفة في ال<strong>جافا</strong> و تعني لا شيء.‏<br />

}<br />

}<br />

الكتابة في ملف:‏ هناك العديد من الأنواع من الكلاس التي تستخدم للكتابة و منها الكلاس PrintWriter و هو<br />

يسمح بالتعديل على الملف آذلك و هو يستخدم آذلك الكلاس FileWriter آمعامل و المعامل الآخر هو من<br />

نوع Boolean حيث اذا وضعنا القيمة true يعمل اضافة على الملف المطلوب اما اذا آانت false فلا يقوم<br />

بالإضافة و انما يمسح ما في الملف السابق و يكتب غيره.‏<br />

مثال برنامج يقرأ من لوحة المفاتيح 10 أرقام و يخزنها في ملف:‏<br />

public class PrintWriterTest {<br />

public static void print(int[] a){<br />

try{<br />

PrintWriter out=new PrintWriter(new FileWriter("c:\ out.txt",false));<br />

for (int i=0;i


}<br />

}catch(IOException e){System.out.println(e);}<br />

public static void main(String[] args){<br />

int[] a=new int[10];<br />

String l;<br />

BufferedReader b=new BufferedReader(new InputStreamReader(System.in));<br />

System.out.println("ENTER TEN NUMBER: ");<br />

try{<br />

for (int i=0;i


في هذه الصورة آل الطلاب لهم اسم و رقم جامعي و علامة و معدل تراآمي و لكن لطلاب الماجستير لهم<br />

معدل اضافي لذالك و ضعنا لهم اوبجكت فرعي من الأوبجكت الرئيسي و هو الطلاب.‏<br />

class MasterStudent extends Student{<br />

تستخدم آلمة extends لعمل آلاس فرعي آالتالي:‏<br />

اسم الكلاس الرئيسي<br />

}<br />

class Student{<br />

private String name;<br />

private double id;<br />

private int mark;<br />

/**Default Constructor of Student Object*/<br />

public Student(){<br />

}<br />

/**Constructor of Student Object with parameter */<br />

public Student(String aName,double aId,int aMark){<br />

name = aName;<br />

id = aId;<br />

mark = aMark;<br />

}<br />

/**accessor to name*/<br />

public String getName(){<br />

return name;<br />

}<br />

/**mutator to name*/<br />

public void setName(String aName){<br />

name = aName;<br />

}<br />

/**accessor to Id*/<br />

public double getId(){<br />

return id<br />

}<br />

/**mutator to Id*/<br />

public void setId(double aId){<br />

id = aId;<br />

}<br />

/**accessor to Mark*/<br />

مثال:‏<br />

الكلاس الرئيسي(‏class :(super


}<br />

public int getMark(){<br />

return mark;<br />

}<br />

/**mutator to Mark */<br />

public void setMark(int aMark){<br />

mark = aMark;<br />

}<br />

الكلاس الفرعي(‏class :(sub<br />

class MasterStudent extends Student{<br />

double BaAvrage;<br />

public MasterStudent(){<br />

}<br />

public MasterStudent(String aName,double aId,int aMark,double aBaAvr){<br />

}<br />

هنا نستخدم الباني في الكلاس الرئيسي الذي له نفس المعاملات super(aName,aId,aMark);<br />

BaAvrage = aBAvr;<br />

//<br />

}<br />

public void setBaAvrage(double average){<br />

BaAvrage = average;<br />

}<br />

public double getBaAvrage(){<br />

return BaAvrage;<br />

}<br />

public String toString(){<br />

return "Master Student :\n"+super.toString+"BaAvrage= : "+getBaAvrage;<br />

}<br />

class StudentTest{<br />

public static void main(String[] args){<br />

Student abdallah = new Student("abdallah ",20111017,80);<br />

MasterStudent amjad = new MasterStudent("amjad",9711123,84,78);<br />

System.out.print(abdallah.toString()+"\n"+amjad.toString());<br />

}<br />

}


this and super:<br />

الدالة super تدل على الكلاس الرئيسي أما الدالة this فتدل على الكلاس التي هي موجودة فيه.‏<br />

و نستطيع استخدام مثلا الدالة<br />

1- في الباني(‏constructor‏)‏ حيث يسمح اسنخدامها في السطر الأول فقط و تكتب آالتالي:‏<br />

‏(المعاملات)‏super<br />

حيث يذهب الى الباني في الكلاس الرئيسي و يستخدم الباني الذي له نفس المعاملات آما في المثال السابق.‏<br />

2- في الميثود حيث نستطيع استخدام الميثود من الكلاس الرئيسي في الكلاس الفرعي باستخدام هذه الدالة<br />

آالتالي:‏<br />

اسم الميثود.‏super<br />

آما في المثال السابق في الميثود toString في الكلاس<br />

و نستطيع استخدام الدالة this آذلك بنفس الطريقة لكن الدالة this تستخدم داخل الكلاس فقط حيث اذا<br />

وضعناها في الباني آالتالي:‏<br />

‏;(المعاملات)‏this<br />

يذهب الى الباني الذي له نفس المعاملات في الكلاس نفسه.‏<br />

آما نستطيع آتابتها في الكونستراآتور و تدل على الأوبجكت الذي ارسل مثلا:‏<br />

public Student(String name){<br />

this.name = name;<br />

. MasterStudent<br />

super بطريقتين :<br />

حيث لو اننا بنينا اوبجكت في المين ميثود آالتالي<br />

تدل this في الباني على الفيلد<br />

}<br />

:<br />

Student abdallah = new Student("abdallah ");<br />

abdallah للأوبجكت name<br />

و بذلك يستطيع التفريق بين الفيلد و الباراميتر.‏<br />

بعض مميزات ال<strong>جافا</strong>:‏<br />

‏:(الهيمنة)‏Overriding<br />

نستطيع في ال<strong>جافا</strong> آتابة نفس الميثود و له نفس المعاملات في الكلاس الفرعي الموجود في الكلاس الرئيسي.‏<br />

‏:(التعددية)‏Polymorphism<br />

نستطيع في ال<strong>جافا</strong> عمل مرجعية للأوبجكت مثلا في المثال السابق نستطيع عمل مساواة بين أوبجكت من نوع<br />

الكلاس الرئيسي بأوبجكت من نوع الكلاس الفرعي آالتالي:‏<br />

MasterStudent y = new MasterStudent();<br />

Student x = y;<br />

هنا لا نستطيع استخدام الميثود الموجودة داخل الكلاس الفرعي للأوبجكت x لأنه من نوع الكلاس الرئيسي.‏<br />

نستفيد من هذه الخاصية بعمل مصفوفة من الطلاب.‏<br />

مثال:‏<br />

Student[] std = new Student[2];<br />

std[0] = new Student();<br />

std[1] = new MasterStudent();<br />

‏:(الربط الديناميكي)‏Binding Dynamic<br />

يستخدم ال<strong>جافا</strong> هذه الخاصية حيث اذا عملنا مساواة مثل في المثال السابق يكون المرجعية في استخدام الميثود<br />

للأوبجكت و ليس للمتغير.‏


System.out.print(x);<br />

حيث في المثال السابق لو وضعنا أمر طباعة آالتالي:‏<br />

يستخدم الميثود toString للأوبجكت y و ليس للمتغير x.<br />

‏:(الكلاس الثابت)‏Class Constant<br />

و هذا يعني أننا لا نستطيع عمل آلاس فرعي لهذا الكلاس يعني لا نستطيع عمل له . overriding<br />

و لجعل الكلاس ثابت نكتب قبله آلمة<br />

مثال:‏<br />

final class Student{…}<br />

.<br />

.final<br />

حيث لا نستطيع عمل آلاس فرعي مثل الكلاس MasterStudent من الكلاس Student لأنه ثابت<br />

في ال<strong>جافا</strong> آل الكلاسات هي عبارة عن آلاسات فرعية للكلاس أوبجكت.‏<br />

‏:(الهرم)‏Hirachies<br />

Object<br />

Student<br />

PacStudent<br />

MasterStudent<br />

‏:(الكلاسات المجردة)‏ Abstract Classes<br />

عندما نعرف آلاس abstract هذا يعني أننا لا نستطيع استخدامه آأوبجكت ولا نستطيع استخدام الميثود التي<br />

يداخله الا من خلال الكلاسات الفرعية مثلا لو نريد عمل برنامج لإستئجار الكتب من مكتبة الجامعة و هناك<br />

نوعين من المستخدمين الأساتذة و الطلاب لذلك نعمل اوبجكت للمستخدمين عامة و اوبجكت فرعية<br />

لكل من الأساتذة و الطلاب.‏<br />

مثال:‏<br />

abstract<br />

abstract class User{<br />

private String name;<br />

private String bookName;<br />

private Date borrowDate;<br />

public User(String _name){<br />

name = _name;<br />

}<br />

public String getName(){<br />

return name;<br />

}<br />

public void borrowBook(String bName){<br />

bookName = bName;<br />

borrowDate = new Date();<br />

}<br />

public void returnBook(){<br />

bookName = null;


}<br />

public String getBook(){<br />

return bookName;<br />

}<br />

public Date getBorrowDate(){<br />

return borrowDate;<br />

}<br />

آتب هذا الميثود ابستراآت و هذا يعني انه يجب آتابته في الكلاسات الفرعية // isLate(); public abstract boolean<br />

}<br />

class Student extends User{<br />

private int Id;<br />

public Student(String aName,int Id){<br />

super(aName);<br />

this.Id = Id;<br />

}<br />

public boolean isLate(){<br />

if (new Date().compareTo(borrowBook)>1)<br />

return true;<br />

return false;<br />

}<br />

public String getName(){<br />

return super.getName();<br />

}<br />

public int getId(){<br />

return Id;<br />

}<br />

}<br />

class Professor extends User{<br />

public Professor(String name){<br />

super(name);<br />

}<br />

public boolean isLate(){<br />

if (new Date().compareTo(borrowBook)>1)<br />

return true;<br />

return false;<br />

}<br />

public String getName(){<br />

return "Dr."+super.getName();<br />

}<br />

}<br />

class LibraryTest{<br />

نبدأ بكتابة الكلاس الفرعي:‏


}<br />

public static void main(String[] args){<br />

User[] users = new User[3];<br />

users[0] = new Student("abdallah ",20111017);<br />

users[0].borrowBook("<strong>Java</strong> 2 V2");<br />

‏;("وائل")‏Professor users[1] = new<br />

users[1].borrowBook("JSP and Servlet");<br />

‏;(‏‎9912312‎‏,"سميح")‏Student users[2] = new<br />

for(int i = 0;i


بعض الأوامر المفيدة:‏<br />

يعمل خروج من البرنامج System.exit(1):<br />

من أوامر الString‏:‏<br />

مثال:‏<br />

يعمل على تحويل احرف الكلمة الى احرف صغيرة:‏ toLowerCase() String<br />

String s = "GhOsT";<br />

String h = s.toLowerCase();<br />

String toUpperCase() :<br />

الخروج<br />

يعمل على تحو يل الأحرف الى أحرف آبيرة<br />

h = "ghost" :<br />

مثال:‏<br />

يقارن الكلمة مع الكلمة أخرى بغض النظر عن نوع الحرف ‏(آبير أو صغير)يرجع 0 اذا<br />

الخروج<br />

int compareToIgnoreCase(String s) :<br />

آانتا الكلمتين متساويتين<br />

String s = "GHOST";<br />

String h = "ghost"<br />

Int l = s. compareToIgnoreCase(h);<br />

String substring(int beginIndex,int endIbdex):<br />

l = 0 :<br />

يعمل على أخذ جزئ من السلسلة و نقو بتحديد قيم beginIndex موقع بداية قطع الكلمة و endIbdex و تحدد نهاية القطع من الكلمة.‏<br />

مثال:‏<br />

الخروج<br />

String s = "muhamad";<br />

String sub = s. substring(2,6);<br />

sub = "hamad" :<br />

واالله ولي التوفيق<br />

يا ربي اجعل عملي هذا خالصا لوجهك الكريم<br />

قريبا إنشاء االله الجزء الثاني

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!