PDA

View Full Version : مبتدی: سوال های من از جاوا



قله بلند
دوشنبه 02 آذر 1388, 16:50 عصر
با سلام

در تفاوت های جاوا با دو زبان c و C++‎ خواندم که:

1-هیچ شیئی نمی تواند خود را از دسترسی از خارج محفوظ کند.

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

2-ماشین مجازی جاوا کاری می کند که خرابکاری هایی ازجمله تبدیل غیر صحیح داده ها(مثلاً تبدیل int به اشاره گر) انجام نشود.

سوال: آیا این خرابکاری در c و C++‎ امکان پذیر است؟

3- اپلت نمی تواند به پورت هایی پایین تر از 1024 گوش کنند.

سوال: پورت های پایین تر از 1024 مخصوص چه کارهایی هستند که اپلت از آن منع شده است؟

4-اگرچه جاوا کاملاً شیء گرا است، اما انواع داده های پایه اینگونه نیستند. آنها مشابه انواع داده های ساده ای هستند که در بیشتر زبانهای غیر شیء گرا یافت می شوند. دلیل این امر کارایی و بازدهی است. تبدیل انواع داده های پایه به شیء ، کارایی را بیش از اندازه کاهش می داد.

سوال: یعنی این داده های پایه به چه صورتی هستند؟ چگونه مثلاً ما در برنامه خود می نویسیم int x; ؟ یادم می آید که در درس C++‎ به ما گفته شد که int یک کلاس است و x شیئی از آن.

5- رفتار System.out.println("10>9 is "+ (10>9));چیست؟

یعنی ابتدا رشته دیده می شود و چاپ می شود. دوم، داخل پرانتز دیده می شود و true برگردانده می شود و سپس + دیده می شود؟ در این حالت + چه چیزی تفسیر می شود؟


System.out.println("10>9 is "+ (10>9)); با تشکر

persianshadow
سه شنبه 03 آذر 1388, 17:14 عصر
سلام

1 - خیر اگه شما صفت و یا متدی رو کپسوله کنید تنها در درون محدوده کلاس قابل دسترسی خواهد بود
و شی‌های خارج از آن قابلیت دسترسی به اون رو ندارن.در ضمن این مشکل نیست بلکه یک اصل شی‌گرای هست
و زبان جاوا این خاصیت رو با ساخت modifier های مثل private که به فیلدها و یا متدها اطلاق میشه حل کرده.

2 - بله در c امکان تبدیل داده‌ها در حین یک عمل درون توابع وجود دارد.

3 - کلآ اپلت‌ها در محیطی به نام sandbox اجرا می‌شوند یعنی امکان دسترسی اپلت به منابع ماشین کاربر
محدود شده است که این موضوع به خاطر این هست که برنامه‌نویس امکان خرابکاری و دسترسی به منابع
کاربر را نداشته باشد.

4 - سئوال 4 رو متوجه نشدم.کلآ داده‌های ابتدای یا همان primitive type که جاوا 8 نوعش رو پشتیبانی می‌کنه
نوعی کلاس هستند که روش ایجاد شی از اون‌ها متفاوت هست دقیقآ مانند اینکه بنویسیم int x یعنی x
متغییری از نوع int خواهد شد.ولی این کلاس‌های پایه‌ای نوع ساخت و تخصیص حافظه به ‌انها متفاوت از
دیگر کلاس‌ها هست.

5 - درباره سئوال آخر هم عملگر +‌ هنگامی که بین رشته‌ها مورد استفاده قرار گیرد باعث چسبیدن
آن دو رشته به هم می‌شود.منظور ترکیب دو رشته هست.

قله بلند
سه شنبه 03 آذر 1388, 22:06 عصر
سلام

1 - خیر اگه شما صفت و یا متدی رو کپسوله کنید تنها در درون محدوده کلاس قابل دسترسی خواهد بود
و شی‌های خارج از آن قابلیت دسترسی به اون رو ندارن.در ضمن این مشکل نیست بلکه یک اصل شی‌گرای هست
و زبان جاوا این خاصیت رو با ساخت modifier های مثل private که به فیلدها و یا متدها اطلاق میشه حل کرده.

2 - بله در c امکان تبدیل داده‌ها در حین یک عمل درون توابع وجود دارد.

3 - کلآ اپلت‌ها در محیطی به نام sandbox اجرا می‌شوند یعنی امکان دسترسی اپلت به منابع ماشین کاربر
محدود شده است که این موضوع به خاطر این هست که برنامه‌نویس امکان خرابکاری و دسترسی به منابع
کاربر را نداشته باشد.

4 - سئوال 4 رو متوجه نشدم.کلآ داده‌های ابتدای یا همان primitive type که جاوا 8 نوعش رو پشتیبانی می‌کنه
نوعی کلاس هستند که روش ایجاد شی از اون‌ها متفاوت هست دقیقآ مانند اینکه بنویسیم int x یعنی x
متغییری از نوع int خواهد شد.ولی این کلاس‌های پایه‌ای نوع ساخت و تخصیص حافظه به ‌انها متفاوت از
دیگر کلاس‌ها هست.

5 - درباره سئوال آخر هم عملگر +‌ هنگامی که بین رشته‌ها مورد استفاده قرار گیرد باعث چسبیدن
آن دو رشته به هم می‌شود.منظور ترکیب دو رشته هست.

با سلام

شما در جواب سوال دوم فرمودید که: بله در c امکان تبدیل داده‌ها در حین یک عمل درون توابع وجود دارد.

سوال: می شود بیشتر توضیح دهید و بفرمایید چرا در جاوا چنین عملی امکان ندارد.

شما در جواب سوال چهارم فرمودید که: کلآ داده‌های ابتدای یا همان primitive type که جاوا 8 نوعش رو پشتیبانی می‌کنه نوعی کلاس هستند که روش ایجاد شی از اون‌ها متفاوت هست دقیقآ مانند اینکه بنویسیم int x یعنی x متغییری از نوع int خواهد شد. ولی این کلاس‌های پایه‌ای نوع ساخت و تخصیص حافظه به ‌انها متفاوت از دیگر کلاس‌ها هست.

سوال: مثلاً اگر برنامه نویس کلاسی را تعریف کند که متغیری از نوع int داشته باشد و شیئی از این کلاس را تعریف کند، کامپایلر به این شیء مثلاً 4 بایت حافظه تخصیص می دهد ولی چون int کلاسی پایه ای است کامپایلر اینگونه فضا به این کلاس تخصیص نمی دهد؟

سوال: شما در جواب سوال پنجم فرمودید که + نقش اتصال بین رشته ها را بازی می کند ولی جواب عبارت بولی که رشته نیست و یا یک عدد صحیح یا اعشاری که یک رشته نیستند. آیا خود تابع println() این تبدیل را انجام می دهد؟

قله بلند
سه شنبه 03 آذر 1388, 22:08 عصر
با سلام

همانگونه که می دانید، رشته ها در برخی زبانها مانند C/C++‎ به صورت آرایه ای از کاراکترها پیاده سازی می شوند. اما در جاوا اینگونه نیست. رشته ها در واقع شیء هستند. چون جاوا رشته ها را به صورت شیء پیاده سازی می کند قابلیت های زیادی برای مدیریت رشته ها دارد و هم استفاده از آنها آسان است.

سوال: می شود راجع به این موضوع کمی بیشتر توضیح دهید.

سوال: فرق این دو تعریف برای آرایه در چیست؟
Int x[]; x=new int[5];
Int x[]=new int[5];نوع byte در جاوا 8 بیتی است. یعنی در محدوده 128- تا 127. اگر با casting بخواهیم عدد صحیح 257 را درون متغیری از جنس byte بریزیم باید عدد 257 بر 256 تقسیم شود. آنچه می ماند باقیمانده است که عدد یک است.

سوال: من وقتی حساب می کنم این عدد باید 255 باشد نه 256؟(خواهشاً به من نخندید! واقعاً نفهمدیم این یک اضافی از کجا اومده)

persianshadow
پنج شنبه 05 آذر 1388, 10:41 صبح
من تا جای که فرصت می‌شه و به نوعی که کلام دچار نقصان نشه پاسخ سوالات شما رو میدم.

درباره عملگر +‌ برای رشته‌ها جواب اون رشته مورد نظر شما به این شکل چاپ خواهد شد :



10>9 istrue


یعنی مقدار بولین به صورت کلمه true به رشته خواهد چسبید.

اما درباره رشته‌ها.String در جاوا یک نوع داده اولیه نیست.چونکه جاوا در داده‌های اولیه خود تنها از
char ها پشتیبانی می‌کند.String در پکیج java.lang.String قابل دسترسی هست و شما می‌توانید
آرایه‌ای از کاراکترها را به رشته بدهید تا رشته با استفاده از متد‌های فراوانی که دارد بر روی آن اعمال مختلفی
انجام دهد.اعمالی نظیر:

جستجو در رشته

مقایسه رشته‌ها

جدا کردن زیر رشته از رشته

و...

همچنین به جز اینکه به صورت ثابت می‌توان به رشته آرایه کاراکتر ارسال کرد می‌توان از خاصیت
StringBuffer برای دریافت همزمان و بلادرنگ داده‌های رشته‌ای بهره برد.


بعد اینکه به نظر من سئوالاتتون رو دونه دونه بگید تا بتونیم با هم بحث کنیم.اینجوری آدم سردرگم
میشه.

قله بلند
پنج شنبه 05 آذر 1388, 11:36 صبح
سلام دوست عزیز. ببخشید که اذیتتون کردم. چشم سعی می کنم که سوال ها را با حجم کمتری بپرسم. آخه علاوه بر اینکه دوست دارم ریشه ای مطلب رو یاد بگیرم انگار عجله هم برای یادگرفتن دارم. می بخشید شما در پست چهارم نظرتون رو درمورد دو سوال آخر نفرمودید. با تشکر

manvaputra
پنج شنبه 05 آذر 1388, 15:20 عصر
دوست عزيز جناب قله بلند (http://barnamenevis.org/forum/member.php?u=44775) از طرح چندين سوال مختلف در عنوان يك تاپيك كلي خود داري نماييد با تشكر

قله بلند
پنج شنبه 05 آذر 1388, 17:48 عصر
دوست عزيز جناب قله بلند (http://barnamenevis.org/forum/member.php?u=44775) از طرح چندين سوال مختلف در عنوان يك تاپيك كلي خود داري نماييد با تشكر

با سلام. می بخشید منظورتون رو متوجه نشدم. یعنی برای هر سوال یک تاپیک بزنم یا اینکه با همین روندی که دارم در هر پست فقط یک سوال مطرح کنم؟
اتفاقاً اومدم که سوال جدیدم رو مطرح کنم که با پست شما مواجه شدم و الان نمی دونم که چه کار کنم. اگر لطف بفرمایید و سریع جواب من را بدهید ممنون می شوم چون در روند یادگیری دچار وقفه می شوم.

persianshadow
پنج شنبه 05 آذر 1388, 19:51 عصر
درباره اینکه دو کد زیر چه تفاوتی با هم دارند :



Int x[]; x=new int[5];
Int x[]=new int[5];



هر دو کد یکسان هستند.اما حالا چطور :

در کد اول شما ابتدا یک آرایه تشکیل می‌دهید از نوع int یعنی با دستور زیر :



int x[];

خب با تکه کد بالا آرایه ساخته می‌شود ولی فضای از حافظه به آن تخصیص داده نمی‌شود یعنی
به جای اشاره نمی‌کند.یک چیز بی‌استفاده.تا اینکه در خط بعد شما به آرایه حافظ تخصیص می‌دهید
که اینکار با کلمه کلیدی new انجام می شود.و در این لحظه آرایه شما به بخشی از حافظه اشاره
می‌کند و شما می توانید از آن استفاده کنید.اما کد بعدی یعنی


int x[] = new int[5];

صورت خلاصه کدبالاست به جای اینکه یکبار آرایه را تعریف و بعد اختصاص دهد در یک خط اینکار انجام شده.

manvaputra
پنج شنبه 05 آذر 1388, 22:37 عصر
با سلام. می بخشید منظورتون رو متوجه نشدم. یعنی برای هر سوال یک تاپیک بزنم یا اینکه با همین روندی که دارم در هر پست فقط یک سوال مطرح کنم؟
اتفاقاً اومدم که سوال جدیدم رو مطرح کنم که با پست شما مواجه شدم و الان نمی دونم که چه کار کنم. اگر لطف بفرمایید و سریع جواب من را بدهید ممنون می شوم چون در روند یادگیری دچار وقفه می شوم.

سلام دوست عزيز شيوه ممنون از توجهتون ، شيوه صحيح در اينه كه براس سوال هاي مختلف تاپيك جداگانه زده بشه بخصوص سوالات شما دوست عزيز كه در حوزه هاي مختلف هستند ممنون از همكاريتون

قله بلند
جمعه 06 آذر 1388, 09:45 صبح
با عرض سلام و تشکر فراوان</p>
با کسب اجازه از مدیر محترم بخش جناب manvaputra عزیز

چون این دو سوال در همین تاپیک عنوان شده، من پاسخ ها را در همین تاپیک پیگیری می کنم و سوال های جدید را در تاپیک های جدید مطرح می کنم.

جناب persianshadow عزیز ضمن تشکر از پاسخ های شما

اصولاً تعریف هر متغیر بلااستفاده ای نامطلوب نیست؟ مثلاً تعریف آرایه به این شکل:
int x[];یا هر متغیری که شاید برنامه نویس در طول کار اصلاً به آن احتیاجی پیدا نکند.(مثلاً فرض کنیم که برنامه نویس اشتباهی مرتکب شده و متغیری را تعریف کرده ولی بدون استفاده و یا نه، کاملاً با قصد قبلی که بلااستفاده باشد آن را تعریف کرده است)چون برنامه های جاوا باید برای ارسال و دریافت در شبکه امنیت را در برداشته باشند، وجود متغیرهای بی استفاده باعث سوء استفاده خرابکارها نمی شود؟ آیا همین امر امنیت برنامه های جاوا را به خطر نمی اندازد؟ آیا بهتر نیست بگوییم که این شکل از تعریف آرایه بهتر از سبک قبلی است؟
int x[]=new int[5];یا نه، این بحث از اساس بی مورد است؟


می بخشید شما به این سوال من گویا توجه نکردید. جوابش برایم خیلی مهم است. سوال آخر در پست چهارم راجع به طول byte که چرا 256 است؟ من که حساب می کنم می شود 255.با تشکر

D32.00110
جمعه 06 آذر 1388, 10:57 صبح
با عرض سلام و تشکر فراوان</p>
با کسب اجازه از مدیر محترم بخش جناب manvaputra عزیز

چون این دو سوال در همین تاپیک عنوان شده، من پاسخ ها را در همین تاپیک پیگیری می کنم و سوال های جدید را در تاپیک های جدید مطرح می کنم.

جناب persianshadow عزیز ضمن تشکر از پاسخ های شما

اصولاً تعریف هر متغیر بلااستفاده ای نامطلوب نیست؟ مثلاً تعریف آرایه به این شکل:
int x[];یا هر متغیری که شاید برنامه نویس در طول کار اصلاً به آن احتیاجی پیدا نکند.(مثلاً فرض کنیم که برنامه نویس اشتباهی مرتکب شده و متغیری را تعریف کرده ولی بدون استفاده و یا نه، کاملاً با قصد قبلی که بلااستفاده باشد آن را تعریف کرده است)چون برنامه های جاوا باید برای ارسال و دریافت در شبکه امنیت را در برداشته باشند، وجود متغیرهای بی استفاده باعث سوء استفاده خرابکارها نمی شود؟ آیا همین امر امنیت برنامه های جاوا را به خطر نمی اندازد؟ آیا بهتر نیست بگوییم که این شکل از تعریف آرایه بهتر از سبک قبلی است؟
int x[]=new int[5];یا نه، این بحث از اساس بی مورد است؟


می بخشید شما به این سوال من گویا توجه نکردید. جوابش برایم خیلی مهم است. سوال آخر در پست چهارم راجع به طول byte که چرا 256 است؟ من که حساب می کنم می شود 255.با تشکر

تعریف آرایه به صورت int x[]; بلااستفاده نیست و برای فراهم کردن امکان ارایه داینامیک است
در مورد 255 هم که شما یکی کم میارید :لبخند: به خاطر 0 هست که فراموش میکنید

persianshadow
جمعه 06 آذر 1388, 12:35 عصر
خب شما همیشه زمانی متغییر تعریف می کنید که بخواهید از اون استفاده کنید در غیر اینصورت نیازی به
تعریف آرایه نیست.خب حالا منظور من از متغییر بلا استفاده چی هست :



int x[];


فرض کنید شما فقط تکه کد بالا رو بنویسید و دیگه حافظه به اون اختصاص ندید یعنی از کلمه کلیدی new

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

چون شما چیزی رو تعریف کردید که به جای از حافظه اشاره نمی کنه و سیستم مدیریت حافظه جاوا

در این حالت شروع به حذف متغییر می کنه. پس منظور من چنین چیزی هست که جز مبانی اولیه جاوا

هست.درباره اون عدد 256 هم که دوست عزیزمون اشاره کردن برای شروع عدد از 0 رو مدنظر قرار بدید.

قله بلند
جمعه 06 آذر 1388, 19:47 عصر
با سلام
جناب persianshadow، شما خیلی زیبا این زباله روبی را در جاوا توضیح دادید. جوابی که دادید خیلی به من چسبید! ولی اگر یادم باشد این خاصیت در C++‎ نبود و این کار باید توسط برنامه نویس انجام می شد. درست است؟ اگر درست است پس همین مساله نیز جزو خصایص جالب جاوا به حساب می آید.

persianshadow
شنبه 07 آذر 1388, 00:34 صبح
زبان سی پلاس پلاس در نسخه‌های اولیه خودش سیستم جمع‌اوری زباله نداشت ولی بعد از اون برنامه‌نویس‌های

زیادی چنین سیستمی برای اون ایجاد کردن ولی c++ این سیستم رو به صورت پیش فرض به خودش اضافه

نکرد چیزی که در جاوا به صورت پیش فرض وجود داره و به عنوان یک پارامتر مهم از اون یاد می‌شه.برای

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

خوبی داره و صد البته اگه از خاصیت بزرگ مستقل از پلتفرم بودن بگذریم.

قله بلند
شنبه 07 آذر 1388, 13:23 عصر
با سلام. دوست و استاد گرامی، طبق دستور جناب مدیرmanvaputra، من نباید دیگه سوال هایم را در ادامه این تاپیک بپرسم. بنابراین سوال هایم را در تاپیک های جداگانه ولی با عنوان مبتدی مطرح می کنم. امیدوارم باز هم بر سرم منت گذاشته و پاسخگوی آنها باشید. با تشکر فراوان