صفحه 2 از 2 نخستنخست 12
نمايش نتايج 11 تا 13 از 13

تاپیک: آموزش مقدماتی برنامه نویسی به زبان جاوا

  1. #11
    پیشکسوت فعال فناوری اطلاعات آواتار Drago
    رشته
    مهندسی فناوری اطلاعات
    مقطع
    دانشجوی فوق لیسانس
    تاريخ عضويت
    2008/10
    محل سكونت
    Right through the Information Flow
    امتیاز
    4017
    پست ها
    2,207

    پيش فرض

    توی این پست میخوام اول یه کم در مورد ساختارهای کنترلی مثل if و while و switch صحبت کنم، این وسط در مورد بعضی عملگرها هم بحث میشه و حلقه رو هم میگیم.
    =======
    ساختاریهای کنترلی که ما توی Java داریم شامل if-then و if-then-else و while و do-while و switch است.
    سینتکس if-then خیلی ساده است :
    كد:
    if ([expression]){			[operation]
    		}
    که توی این کد [expression] یه عبارته که جوابش true یا false هست. مثلا :
    كد:
    public static void main(String[] args){
    		int x = 6;
    		if (x>5){
    			System.out.print("X is higher than 5");
    		}
    	}
    اما اگه x از ۶ کوچیکتر بود چی؟ اونوقت میشه if-then-else :
    كد:
    if([expression1]){
    		[operation1]
    	}else{
    		[operation2]
    	}
    مثلا :
    كد:
    public static void main(String[] args){
    		int x = 6;
    		if (x>5){
    			System.out.print("X is higher than 5");
    		}else{
    			System.out.print("X is not higher than 5")
    		}
    	}
    حالا ممکنه ما بخوایم اون else هم شرطی بشه. مثلا اگه عدد بین ۰ تا ۵ بود یه چیز، اگه خود ۵ بود یه چیز و اگه بیشتر بود یه چیز دیگه چاپ بشه :
    كد:
    public static void main(String[] args){
    		int x = 6;
    		if(x < 5){
    			System.out.print("X is lower than 5.");
    		}else if (x==5){
    			System.out.print("X is 5");
    		}else {
    			System.out.print("X is higher than 5");
    		}
    	}
    میتونیم تعداد خیلی زیادی if داشته باشیم که هر کدوم یه چیزی رو چک می‌کنه، اما این کار کثیف کاریه. وقتی تعداد if ها از یه تعدادی بیشتر شد می‌تونیم از switch استفاده کنیم. توی دستور switch ما یه مقدار رو میگیریم و بنابر حالتهای مختلف تصمیم میگیریم :
    كد:
    public static void main(String[] args){
    		int x = 0;
    		switch (x) {
    		case 0:
    			System.out.print("X is zero.")
    			break;
    		case 1:
    			System.out.print("X is one.")
    			break;
    		case 2:
    			System.out.print("X is two.")
    		default:
    			System.out.print("X is not zero or one on two.")
    			break;
    		}
    	}
    مثال قبل رو اگه می‌خواستیم با if بنویسیم این شکلی میشد :
    كد:
    if (x==0){
    			System.out.print("zero");
    		}else if(x==1){
    			System.out.print("one");
    		}else if(x==2){
    			System.out.print("two");
    		}else{
    			System.out.print("X is not zero or one on two.");
    		}
    ممکنه به نظر کوتاهتر بیاد، اما کثیفتره.
    چند تا نکته در مورد switch :
    ۱. چرا باید آخر هر عملیاتی که توی switch مینویسیم break بزاریم؟ چون در واقع اون case فقط یه لیبله (label) و عملیات خاصی رو اجرا نمیکنه. اگه break نذاریم همه عملیاتی که بعد از اون label هست اجرا خواهد شد. میتونید امتحان کنید خودتون.
    ۲.اون دیفالت آخرین مورد باید نوشته بشه و کارش هم اینه که اگر کلیدمون (در اینجا x) در هیچکدوم از value ها (در اینجا ۰ و ۱و ۲) نبود متوجه بشیم و شاید بخوایم یه عملیاتی رو انجام بدیم.

    اما اگه اون کلید ما فقط دوحالت داشت چی؟ مثلا true یا false بود. اگه بخوایم با if یا سوییچ بنویسیم این شکلی میشه :
    كد:
    public static void main(String[] args){
    		int x = 1;
    		switch (x) {
    		case 1:
    			System.out.print("X is one.");
    			break;
    		default:
    			System.out.print("X is two.");
    			break;
    		}
    		
    		if (x==1){
    			System.out.print("X is one.");
    		}else {
    			System.out.print("X is two.");
    		}
    اما یه چیزی داریم به اسم ternary if یا if سه گانه.
    دستورش اینجوریه :
    كد:
    ([expression] ? [true operation] : [false operation])
    توی قسمت expression یه عبارتی که جواب true/false داره قرار میدیم. اگه جواب true بود اولیه برمی‌گرده، اگه فالس بود دومیه. اما دقت کنید که در این روش حتما یه چیزی برمی‌گرده، یعنی بحث عملیات نیست. مثلا :
    كد:
    public static void main(String[] args){		int x = 1;
    		boolean y;
    		 y = (x==1 ? true : false);
    		 System.out.print(y);
    	}
    توی این کد اگه x برابر ۱ باشه true واگه نباشه false برمیگیرده. دقت کنید که گفتیم عملیات نمیشه انجام داد توی if سه گانه، یعنی کد زیر غلطه :
    كد:
    public static void main(String[] args){
    		int x = 1;
    		
    		(x==1 ? System.out.print(true) : System.out.print(false));
    		
    	}
    حلقه while رو فکر می‌کنم همه آشنایی دارید، تا وقتی که شرط برقراره، عملیات ادامه پیدا می کنه:
    كد:
    public static void main(String[] args){
    		int x = 5;
    		
    		while (x>0){
    			System.out.print(x);
    			x = x-1; // or x--
    		}
    	}
    do - while هم شبیه اینه، با این تفاوت که حتما عملیات یه بار اجرا میشه. مثلا توی مثال بالا اگه x صفر باشه، عملیات چاپ هیچوقت انجام نمیشه اما همین رو با do-while مینویسیم :
    كد:
    public static void main(String[] args){
    		int x = 5;
    		
    		do{
    			System.out.print(x);
    			x = x-1; // or x--
    		}
    		while (x>0);
    	}
    توی این مثال اگه x=0 باشه هم حلقه یه بار اجرا میشه (اگه هر عددی باشه، حتی منفی ۱۰۰۰ هم باشه باز هم یه بار اجرا میشه).

    حالا این جاهایی که یه عبارت می‌نویسیم که جواب صحیح یا غلط باید بده، اگه خواستیم چندتا موضوع با هم رو چک کنیم چی؟ یعنی مثلا هم x>0 و هم Y>0 باشه باید چیکار کنیم؟
    عملگر and توی java به صورت && هست. عملگر & هم داریم که استفاده اش متفاوته و به کار ما نمیاد، میتونین مستنداتش رو خودتون بخونین.
    عملگر or هم به صورت || مشخص میشه. عملگر | هم داریم که استفاده اش متفاوته و به کار ما نمیاد، میتونین مستنداتش رو خودتون بخونین.
    ===========
    حلقه for رو هم بگم.
    تاحالا کسی براش سوال پیش نیومده که اون آرایه استرینگ که اسمش رو گذاشتیم args و توی متد main هست چیه و به چه درد می خوره؟
    ببینید اصولا اگه ما از IDE استفاده نکنیم، باید برنامه رو توی کامند لاین اجرا کنیم. اول باید فایلهایی که درست کردیم و پسوند java. دارند (مثل همین کلاسی که ساختیم) رو کامپایل کنیم تا تبدیل به class. بشه (تبدیل به بایت کد بشه) تا JRE بتونه اونها رو بخونه و بفهمه. بعد هم اون class. رو اجرا میکنیم.
    کار عجیب و سختی هم نیست، کافیه بنویسیم :
    كد:
    برای کامپایل کردن :
    javac MyFirstClass.java
    
    و برای اجرا :
    java MyFirstClass
    اما جلوی این دستور دوم میتونیم یه سری آرگومان هم بفرستیم. این آرگومانها همونها هستند که میان و میرن توی اون آرایه استرینگ میشینن!
    اما ما که از کامند لاین استفاده نمی‌کنیم چطور می‌تونیم این آرگومانها رو بفرستیم؟ توی Eclipse از منوی run گزینه ...Run Configurations رو انتخاب کنید.
    بعد توی تب Arguments آرگومانهاتون رو بنویسید. دقت کنید که در این حالت هر کلمه که بعدش یه اسپیس بزنید یه آرگومان حساب میشه.
    مثلا توی این تصویر ما ۳ تا آرگومان نوشتیم (میتونستیم هر کدوم رو توی یک خط هم ننویسیم).


    حالا چرا این آرگومانها رو معرفی کردیم؟ که هم آرگومانها رو یاد بگیرید و هم یه loop بنویسیم.
    یه حلقه‌ی for دستورش اینجوریه :
    كد:
    for([variable];[condition];[step]){			[operation]
    		}
    مثلا یه نمونه ساده اش میتونه این باشه :
    كد:
    public static void main(String[] args){
    		
    		int x = 5;
    		for(int i=0;i<x;i++){
    			System.out.print(i);
    		}
    		
    	}
    که خب اعداد ۰ تا ۴ رو چاپ خواهد کرد.
    اما بیایم از اون args هم استفاده کنیم :
    كد:
    public static void main(String[] args){		
    		for(int i = 0;i<args.length;i++){
    			System.out.println(args[i]);
    		}
    	}
    این برنامه میاد و هر کدوم از آرگومانهایی که فرستادیم رو توی یه خط چاپ میکنه.

    ===
    خب، فکر کنم واسه یه جلسه این کافی باشه.

    تمرین : یه حلقه for بنویسید که یه آرایه از int بگیره و اعداد زوجش رو چاپ کنه. هر ۵ عدد که چاپ کرد یه خط هم زیرش بکشه.

    راهنمایی جهت حل :
    (با زدن نقطه بعد از متغیرهاتون میتونید به عملیاتش دسترسی داشته باشید، مثل کاری که بالا برای پیدا کردن اندازه آرگومانها کردیم.)
    شما باید یه آرایه تعریف کنید. به اندازه ای که دلتون می‌خواد بهش مقدار دهی کنید و بعد هم با شرایط گفته شده چاپش کنید. چون هنوز در مورد property های کلاس چیزی نگفتیم همه این کارها رو توی متد main میتونید انجام بدید.
    Got to feel - woke up inside again
    Got to feel less broke more fixed
    Got to feel when I got outside myself
    Got to feel when I touched your lips


  2. تشكرها از اين پست


  3. #12
    پیشکسوت فعال فناوری اطلاعات آواتار Drago
    رشته
    مهندسی فناوری اطلاعات
    مقطع
    دانشجوی فوق لیسانس
    تاريخ عضويت
    2008/10
    محل سكونت
    Right through the Information Flow
    امتیاز
    4017
    پست ها
    2,207

    پيش فرض

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

    اینکه مفهوم کلاس از نظر تئوریک چیه و غیره رو واقعا من حوصله توضیح دادنش رو ندارم. اما حتما حتما این مسائل رو توی یه کتاب خوب بخونید. ما مستقیم میریم سر کد.

    تعریف کلاس ساده است :
    كد:
    public class MyClass {
    }
    تک تک این اجزا معنی دار هستند و مهم.
    public حوزه دسترسی کلاس رو مشخص میکنه. هرچند من ندیدم تا حالا کلاسی private یا protected باشه اما به هر حال کلاسهای public توسط سایر کلاسها قابل دسترسی هستند.
    class هم که کلاسه دیگه! ما می‌خوای چی تعریف کنیم؟ کلاس!
    اسم کلاس حتما باید اولش با حروف بزرگ باشه.اسم کلاسها رو با معنی انتخاب کنید، حتی اگه طولانی بشه. ما معمولا کلاسها رو به صورت گرافیکی با کلیک کردن روی منوهای مورد نظر میسازیم.

    حالا یه کلاس داریم. هر کلاسی نماینده گروهی از اشیاء مشابه است و هر نمونه از این کلاس یه شی‌ گفته می‌شه. مثلا کلاس دانشجو داریم و هر دانشجوی مشخص یه شی از این کلاسه.
    کلاس (در واقع شی) یه سری فیلدها (Field که گاهی Property هم گفته میشه) داره و یه سری هم رفتار یا متد داره. مثلا دانشجو فیلدهایی مثل شماره دانشجویی، نام، کدملی،‌ واحدهای اخذ کرده، تعداد واحد ترم جاری و غیره داره، یه سری متدها مثل انتخاب واحد، انصراف، پرداخت شهریه ، مطالعه و غیره داره.
    مثلا تصور کنید یه برنامه ای برای یه کتابخونه می خوایم بنویسیم (همینجوری به ذهنم رسید، معماریش هم توی ذهنم نیست، اگه گیر کردیم کمک کنید!!).
    یه کلاسی درست می‌کنیم به اسم عضو. عضو چی داره؟ مثلا شماره عضویت، اسم، لیست کتابهایی که پیششه، تاریخ عضویت.
    چه کارایی می‌تونه بکنه؟ می‌تونه عضو بشه، کتاب بگیره، کتابش رو پس بده.
    می تونه اینجوری باشه :
    كد:
    public class Member {
    
    
    	Integer memberId;
    	protected String name;
    	private String[] borrowedBooks;
    	public Integer signUpDate;
    	public static int numberOfMembers;
    	
    
    
    	public void register(String name){
    		this.name = name;
    		numberOfMembers ++;
    	}
    	
    	private int getABook(){
    		//do something!
    		return 0;
    	}
    	protected boolean returnBook(Long bookId){
    		//some operation!
    		return true;
    	}
    }
    همونطور که میبینید ما ۵ تا فیلد برای این کلاس تعریف کردیم. من سعی کردم هر کدوم رو متفاوت تعریف کنم که با انواعش آشنا بشید.
    اولین فیلد رو این طوری تعریف کردیم که فقط نوعش و اسمش رو نوشتیم. این فیلد به طور پیشفرش public خواهد بود، یعنی تمام کلاسهای دیگه ،چه توی این پکج باشند و چه نباشند، چه ساب کلاس این کلاس باشند و چه نباشند، بهش دسترسی خواهند داشت.
    دومین فیلد رو protected تعریف کردیم. در این حالت کلاسهایی که در این پکج هستند و ساب کلاس های این کلاس بهش دسترسی دارند.
    سومین فیلد private تعریف شده، یعنی فقط خود این کلاس بهش دسترسی داره، هیچ کس دیگه نمیتونه به این فیلد به صورت مستقیم دسترسی داشته باشه.
    چهارمین فیلد رو public تعریف کردیم. چه کلمه‌ی پابلیک رو بنویسم و چه هیچی ننویسیم هیچ فرقی نداره. این فیلد هم از نظر دسترسی دقیقا مشابه فیلد اول خواهد بود.
    اما آخرین فیلد یه کلمه‌ی static اضافه داره، یعنی چی؟ یعنی این فیلد به ازای هر شی مقدار نمی‌گیره و مقدارش برای همه اون اشیا مثل همه.
    بزارید استاتیک رو بیشتر توضیح بدیم : ما ۲ تا عضو داریم توی این کتابخونه : سلم و تور. سلم ۲ تا کتاب و تور ۱ کتاب گرفته. سلم یک سال پیش و تور یک ماه پیش عضو شده. پس تا اینجا همه فیلدهاشون با هم فرق می‌کنه. اما اگه از سلم بپرسی چندتا عضو توی این کتابخونه است میگه ۲ تا، اگه از تور هم بپرسی میگه ۲ تا.


    برسیم به متدها. راستش من سعی کردم عملیات زیادی رو توی متدها پیاده نکنم تا بیشتر به سینتکس و تعریف متدها بپردازیم نه عملیاتشون.
    همونطور که میبینید متدها هم میتونن public , private و یا protected باشن. حوزه دسترسی متدها هم دقیقا مثل فیلدهاست.
    اما برای متدها باید نوع بازگشتی مشخص بشه. نوع بازگشتی دومین کلمه ایه که توی تعریف متد نوشته میشه، مثلا متد ()getABook نوع بازگشتیش int ، متد ()returnBook نوع بازگشتیش boolean (یا همون true و false) است. اما متد ()register بازگشت نداره و void است.

    حالا اینا که نوشتیم به چه درد می‌خوره؟ بریم توی کد!
    این کلاس Member رو که نوشتیم بیایم یه کلاس TestMember هم بنویسیم :
    كد:
    
    public class TestMember {
    
    
    	public static void main(String[] args){
    		Member.numberOfMembers = 2;
    		Member salm = new Member();
    		Member tur = new Member();
    		salm.register("Salm");
    		tur.register("Toooor");
    		System.out.println("Salm's name is : " + salm.name);
    		System.out.println("Tur's name is : " + tur.name);
    		int canSalmGetABook = salm.getABook();
    		System.out.println(canSalmGetABook);
    		Member.numberOfMembers = 2;
    		System.out.println(salm.numberOfMembers);
    		System.out.println(tur.numberOfMembers);
    		System.out.println(Member.numberOfMembers);
    	}
    }
    دقت کنید که main رو می‌تونستیم توی خود همون کلاس Member بنویسیم، از نظر فنی فرقی نمی‌کنه. منتها من ترجیح می‌دم کارم تمیز باشه. لازم نیست در مصرف کلاس صرفه جویی کنیم!

    متدهای static هم داریم. مثل فیلدهای استاتیک این متدها هم وابسته به شی‌ خاصی نیستند. در متدهای استاتیک نمیشه از فیلدهای غیر استاتیک استفاده کرد.

    مبحث بعدی Constructor است. میبینید که ما وقتی یه آبجکت از Member گرفتیم و initializeش کردیم نوشتیم ()new Member. این Constructor پیشفرضه و میبنید که هیچ پارامتر ورودی نگرفته.
    اینجا چند مدل کانستراکتور میبنید :
    كد:
    public class Member {
    
    
    	Integer memberId;
    	protected String name;
    	private String[] borrowedBooks;
    	public Integer signUpDate;
    	public static int numberOfMembers;
    	
    	public Member(){
    		
    	}
    	public Member(String name){
    		this.name = name;
    	}
    	public Member(String name,Integer signUpDate){
    		this.name = name;
    		this.signUpDate = signUpDate;
    	}
    	
    	// methods
    }
    همونطور که مشخصه برای ساخت کانتراکتور کافیه حوزه رو مشخص کنیم و اسم کلاس رو بنویسم.
    میبینید که ما چند تا کانستراکتور داریم که همه ظاهرشون یکیه فقط پارامتر ورودیشون فرق می‌کنه. ممکنه چندتا متد هم داشته باشیم که اسم همه مثلا save یا register باشه، اما پارامترهای ورودی با هم فرق کنه. به این کار Over Loading میگن. هر کدوم از اون متدها ممکنه به یه درد بخورن و یه زمان خاصی فراخوانی بشن.
    برگردیم سر کانستراکتور. ما الان می‌تونیم یه آبجکت از Member رو به صورت های مختلف بگیریم :
    كد:
    public class TestMember {
    
    
    	public static void main(String[] args){
    		Member salm = new Member();
    		System.out.println("Salm's name is null : " + salm.name);
    		Member tur = new Member("tooor");
    		System.out.println("Tur used a constructor : "+ tur.name);
    		Member iraj = new Member("Iraj", 1392);
    		System.out.println("Iraj was the favorite son : " + iraj.name + ' '+ iraj.signUpDate);
    		
    	}
    }
    تفاوتشون رو متوجه میشید؟
    توی دیفالت کانستراکتور میتونید کارهای زیادی بکنید، مقداردهی های اولیه و غیره.

    اما یه چیزی رو دقت کردید؟ اینکه اسم فیلد با اسم پارامتر ورودی یکی بود. مثلا متد register یه رشته به نام name میگیره. ما از کجا بدونیم که توی متد وقتی مینویسیم name منظور فیلد کلاسه یا پارامتر ورودی؟! اگه دقت کرده باشید این موضوع رو با this کنترل کردیم. یعنی وقتی قراره به فیلد کلاس اشاره کنیم از this استفاده میکنیم.
    وقتی مینویسم this.name = name سمت راست به پارامتر و سمت چپ به فیلد اشاره داره. و فقط هم برای آبجتکی که این متد رو فراخوانی کرده اعمال میشه یعنی در واقع this به اون آبجکت اشاره میکنه.

    فکر کنم واسه امروزمون کافی باشه. جلسه بعد یه کم در مورد فرق انواع اولیه داده مثل int با کلاسهای متناظر مثل Integer صحبت می‌کنیم و بعدش یه کم در مورد پکج java.util حرف میزنیم.

    ([مشاهده ی لینک ها فقط برای اعضا امکان پذیر است. ] سه پسر داشت : سلم، تور و ایرج)
    Got to feel - woke up inside again
    Got to feel less broke more fixed
    Got to feel when I got outside myself
    Got to feel when I touched your lips


  4. تشكرها از اين پست


  5. #13
    پیشکسوت فعال فناوری اطلاعات آواتار Drago
    رشته
    مهندسی فناوری اطلاعات
    مقطع
    دانشجوی فوق لیسانس
    تاريخ عضويت
    2008/10
    محل سكونت
    Right through the Information Flow
    امتیاز
    4017
    پست ها
    2,207

    پيش فرض

    توی این جلسه یه کم در مورد بعضی از کلاسهای موجود در پکج java.lang و java.util صحبت می‌کنیم.
    ================
    پکج java.lang در واقع شامل تمام کلاس‌های اصلی جاوا است. مثلا کلاس Object در این پکجه و دقت داشته باشید که که تمام کلاس‌ها در جاوا ساب کلاس Object محسوب می‌شن!
    غیر از کلاسی مثل آبجکت، کلاسهایی مثل مثل String، Integer و غیره هم توی پکج java.lang وجود داره. بزارید یه کم بیشتر توضیح بدیم.

    توی جلسه قبلی متوجه چیزی نشدید؟ متغیر numberOfMembers نوعش int هست پس عدد صحیح میگیره. متغیر signUpDate هم عدد صحیح میگیره، اما با Integer. اولی نوع داده اولیه یا همون primitive است و دومی یک کلاس. درواقع وقتی می‌نویسم Integer signUpDate داریم یه آبجکت از کلاس Integer (یا درواقع java.lang.Integer) میگیریم.
    اگه فیلد numberOfMembers رو فراخوانی کنیم ، مثلا بنویسیم salm.numberOfMembers و بعدش یه نقطه بزاریم هیچ اتفاقی نمیفته، هیچ متدی در اختیار شما قرار نمیگیره، چون از نوع اولیه است. اما اگه بنویسیم salm.signUpDate و بعد نقطه بزاریم به متدهای کلاس دسترسی پیدا می‌کنید : متدهایی مثل ()compareTo و ()doubleValue
    اما خب چرا این کارو بکنیم؟ این متد‌ها به چه درد می‌خورن؟ type casting می‌دونید چیه؟ ما یه عدد اعشاری داریم و می‌خوایم تبدیل به عدد صحیح کنیم، یا از اون ساده تر، یه عدد long داریم و می‌خوایم به int تبدیل کنیم، باید چیکار کنیم؟
    اصولا ما توی جاوا type casting رو به این صورت انجام می‌دیم، مثلا تبدیل int به fload :
    كد:
    float someValue = (float) someValue;
    خب این کار بعضی وقت‌ها جواب می‌ده، اما جاوا به type casting خیلی حساسه. به راحتی اجازه این کار رو نمی‌ده. پس چرا دردسر بکشیم؟! یکی از متدهای کلاس Integer اسمش ()
    floatValue است و کارش هم دادن مقدار float از همون متغیره.
    اما اگه مقدار Float اون متغیر Integer رو بخوایم چی؟! (نگید که به بزرگ و کوچیک بودن حروف دقت نکردید...) کلاسهایی مثل Integer و Float یه سری متد استاتیک هم دارن برای تبدیل هر چیزی به اون کلاس. مثلا ما ممکنه یه استرینگ داشته باشیم که توش یه عدد صحیح نوشته شده باشه.با ()Integer.parseint میشه این کار رو کرد. امتحان کنید!
    این موضوع موضوع جالبه، سعی کنید خوب بفهمیدش.

    موضوع بعدی بعضی از کلاسهای پکج java.util هست.مثلا دیدید که ما در مثال قبل تاریخ رو یه Integer گرفته بودیم...مسخره نیست؟! کلاس Date یکی از کلاسهای این پکجه.
    حالا ما می‌خوایم یه آرایه از کلاس Member داشته باشیم.باید چیکار کنیم؟ شاید اینطوری حدس بزنید :
    كد:
    Member[] membersList = {};
    بله، از نظر تکنیکال امکان پذیره که همچین آرایه ای تعریف کنیم... اما حالا چجوری می‌خواید یه عضو به این آرایه اضافه کنید؟!
    این کد رو ببینید :
    كد:
    Member[] membersList = {};
    		membersList[0] = salm; // ArrayOutOfBoun***ception!
    حتی به خونه 0 هم نمی‌تونید مقدار بدید! آرایه رو هم نمی‌خوایم (و اصلا درست هم نیست) که همون اول آرایه رو مقدار دهی کنیم.
    یه کلاسی داریم به اسم ArrayList که آرایه است و متدهای خوبی هم داره :
    كد:
    	public static void main(String[] args){
    		Member salm = new Member();
    		Member tur = new Member("tooor");
    		Member iraj = new Member("Iraj", 1392);
    		ArrayList membersArray = new ArrayList();
    		membersArray.add(salm);
    		membersArray.add(tur);
    		System.out.println("This guy is in the first index of array : "+membersArray.get(0));
    		if(membersArray.contains(iraj)){ // .contains() returns boolean
    			System.out.println("No iraj in array :(");
    		}
    		System.out.println("Size of Array is : " +membersArray.size());
    		System.out.println("There was no iraj in array so no delete was done, so method returned =>"+membersArray.remove(iraj));
    		System.out.println("There was a salm in array so it was removed and method returned =>"+membersArray.remove(salm));
    		System.out.println("Size of Array is : " +membersArray.size());
    		System.out.println("Now this guy is in the first index of array : "+membersArray.get(0));
    		membersArray.clear();
    		System.out.println("Size of Array after clear is : " +membersArray.size());
    	}
    توی مثال بالا بعضی از کاربردهای ArrayList رو میبینید.
    اگه می‌خواستیم مثلا آرایه رو به همون روش سنتی تعریف کنیم و توی هر خونه آرایه یه آرایه داشته باشیم که توی هر خونه اش یه آرایه باشه(در واقع یه آرایه ۳ بعدی) باید چیکار میکردیم؟
    [] [] []Member جواب می‌ده اما کنترل کردن و کار کردن باهاش کابوسه! به جاش اینو ببینید :
    كد:
    ArrayList thirdDimension = new ArrayList();
    		ArrayList secondDimension = new ArrayList();
    		ArrayList firstDimension = new ArrayList();
    		secondDimension.add(thirdDimension);
    		firstDimension.add(secondDimension);
    که روی هر کدوم از این آرایه ها هم همه اون متدهای بالا رو در اختیار دارید.

    --------------------------------------
    دوتا نکته رو در مورد کلاسها بگم. توی کلاسها ما معمولا ۳ تا متد داریم که Override می‌کنیم. Override کردن یعنی سوپرکلاس ما یه متدی رو داره و ما میایم دوباره اون رو با یه عملیات دیگه تعریف میکنیم. اون ۳ تا متد equals و toString و hashCode هستن.
    از hashCode میگذریم، اما اون دوتا متد دیگه خیلی لازم و مهمن.
    equals میاد و دو تا آبجکت رو با هم مقایسه میکنه. مثلا ما مینویسیم (salm.equals(tur و جواب برمیگرده که false. اما چطور؟ بیاید متدش رو بنویسم :
    كد:
    public boolean equals(Object o){
    		if(o instanceof Member){
    			Member memberObject = (Member) o;
    			if(memberObject.name == this.name 
    		   	   && memberObject.memberId == this.memberId 
    			   && memberObject.signUpDate == this.signUpDate){
    				return true;
    			}
    		}
    		return false;
    	}
    instanceof از معدود کلمات کلیدی دو قسمتی جاوا هست. اما کارش اینه که مشخص میکنه آیا o از نوع Member هست یا نه؟ این باعث میشه مشکلی برای type casting پیش نیاد چون بعدش ما آبجکت o رو به کلاس Member کست کردیم. همه کلاسهای جاوا متد equals رو دارند. مقایسه دوتا آبجکت با عملگر == روش خوبی نیست. برای عدد شاید به درد بخوره اما برای آبجکت نه.حتی ما استرینگ رو هم ترجیح می‌دیم با این روش مقایسه کنیم. دلیلش رو اگه وقت شد و حوصله بود براتون می‌گم اگه نه برید سرچ کنید : pass by reference java

    متد بعدی toString هست. اگه مثال آرایه رو اجرا کرده باشید دیدید که وقتی گفتیم (0)memberArray.get انتظار داشتیم یه آبجکت از Member برگرده، اما وقتی چاپ شد یه چیزی شبیه core.Member@4cb162d5 چاپ شد. این در واقع به آدرس اون آبجکت توی حافظه داره اشاره میکنه! این قیافه به درد ما نمی‌خوره.می‌خوایم وقتی یه آبجکت از Member رو خواستیم چاپ کنیم به یه شکل مفید و به درد بخور چاپ بشه. برای این کار از toString استفاده میشه. ببینید:
    كد:
    public String toString(){
    		return "Member : {" +
    				"Name :"+ this.name+
    				" Id :"+ this.memberId+
    				" signUpDate:"+this.signUpDate+
    				"}";
    	}
    میشد از بقیه فیلدها هم استفاده کرد ولی واقعا خسته ام! معمولا از همه‌ی فیلدهای کلاس استفاده می‌شه.
    به کلاس Memberتون این دوتا متد رو اضافه کنید و دوباره اون مثال آرایه رو اجرا کنید ببینید چه فرقی می‌کنه.
    ===================
    چندتا تمرین می‌دم بعد از اینکه جواب دادید HashMap رو می‌گم :
    ۱. متدی بنویسید که یک رشته به عنوان ورودی بگیرد و اگر اعدادی در آن رشته وجود دارد آنها را چاپ کند. (مثلا رشته "abcd 14 ef 5 gh 7" رو بگیره و 1457 رو چاپ کنه)
    ۲. متدی بنویسید که یک رشته به عنوان ورودی بگیرد و مجموع اعداد در آن رشته را چاپ کند (مثلا در مثال بالا باید عدد ۱۷ چاپ بشه)
    ۳.متدی بنویسید که یک رشته به عنوان ورودی بگیرد و کلمات تکراری را حذف کند و نتیجه را در خروجی چاپ کند.
    Got to feel - woke up inside again
    Got to feel less broke more fixed
    Got to feel when I got outside myself
    Got to feel when I touched your lips


  6. تشكرها از اين پست


صفحه 2 از 2 نخستنخست 12

تاپیک های مشابه

  1. آموزش کامل برنامه نویسی به زبان اندروید
    توسط mohsenkia70 در تالار برنامه نویسی موبایل
    پاسخ ها: 5
    آخرین ارسال: 2014/3/25, 09:17 PM
  2. آموزش برنامه نویسی به زبان پاسکال
    توسط mahdieskandari در تالار جزوه های مهندسی شیمی
    پاسخ ها: 4
    آخرین ارسال: 2013/8/13, 09:58 PM

برچسب های اين تاپیک

ثبت اين صفحه

ثبت اين صفحه

قوانين ارسال

  • شما نمی‌توانيد تاپيک جديد ارسال كنيد
  • شما نمی‌توانيد پاسخ ارسال كنيد
  • شما نمی‌توانید فایل ضمیمه ارسال كنيد
  • شما نمی‌توانيدنوشته‌های خود را ويرايش كنيد
  •