آموزش زبان جاوا_قسمت 7
تحریریه کدیاد
تاریخ انتشار : شنبه 27 فروردین 1401
در این جلسه از آموزش جاوا قصد داریم کمی بیشتر درباره سایر تفاوتهای میان انواع داده پیشرفته و انواع داده اولیه در زبان برنامهنویسی جاوا صحبت کنیم و نکات مهمی را دراینخصوص در اختیار شما قرار دهیم. دقت داشته باشید که بخش قبلی درباره سینتکس و نحوه تعریف این دو نوع داده صحبت کردیم و در این بخش بیشتر تمرکز خود را روی نحوه ذخیرهسازی این متغیرها در حافظه قرار خواهیم داد. پس اگر شما هم علاقهمند به داشتن اطلاعات بیشتر در این زمینه هستید به شما پیشنهاد میکنیم ادامه این جلسه از آموزش برنامهنویسی جاوا (Java) را بادقت مطالعه کنید.
تفاوت ذخیرهسازی دادهها
نکات ابتدایی درباره تفاوت ذخیرهسازی دادهها در زبان جاوا
اجازه دهید کار خود را با قطعه کد زیر شروع کنیم و در ادامه توضیحاتی را در خصوص تفاوت بین ذخیرهسازی این دو نوع داده در این قسمت از آموزش جاوا به شما ارائه دهیم:
package com.hamed;
public class Main{
public static void main(String[] args){
int x = 1;
int y = x;
System.out.println(“x: “ + x);
System.out.println(“y: “ + y);
}
}
با اجرا گرفتن از این کد خروجی زیر برای شما نمایش داده میشود:
x: 1
y: 1
حال قطعه کد زیر را در نظر بگیرید:
package com.hamed;
public class Main{
public static void main(String[] args){
int x = 1;
int y = x;
x = 2;
System.out.println(“x: “ + x);
System.out.println(“y: “ + y);
}
}
زمانی که این قطعه کد را اجرا میکنید خروجی زیر برای شما نمایش داده میشود:
x: 2
y:1
حال سوالی که پیش میآید این است که چرا مقدار متغیر y به علت تغییر مقدار متغیر x تغییر نکرد؟
عدم تغییر متغیر y
علت عدم تغییر مقدار متغیر y در قطعه کد بالا
ما در برنامهنویسی جاوا یک حافظه داریم با نام stack زمانی که دستور int x = 1; اجرا میشود یک مقدار از حافظه استک به متغیر x اختصاص داده میشود و داخل آن نیز مقدار 1 قرار میگیرد. حال زمانی که دستور int y = x; اجرا میشود یک قسمت دیگر از حافظه به متغیری به نام y اختصاص داده میشود و سپس مقداری که در متغیر x قرار داده شده بود( عدد 1) کپی شده و در داخل بخشی از حافظه که متعلق به متغیر y است قرار میگیرد. حال اگر مقدار متغیر x را تغییر دهیم تنها آن بخش از حافظه که متعلق به متغیر x بود تغییر میکند و مقدار متغیر y تغییری نمیکند. بنابراین در آموزش جاوا حتما به این نکته دقت داشته باشید و سعی کنید از این مزیت زبان جاوا به شکل درستی استفاده کنید.
عملکرد reference typeها
مثالی از عملکرد reference typeها در زمان ذخیره شدن در حافظه
در این بخش قصد داریم مثال بالا از عملکرد انواع داده ساده را به انواع داده پیشرفته تعمیم دهیم و در این بخش از آموزش جاوا درباره عملکرد این نوع دادهها نیز صحبت کنیم. برای این کار قطعه کد زیر را در نظر بگیرید:
package com.hamed;
import java.awt.*;
public class Main{
public static void main(String[] args){
Point point1 = new Point(1,1);
Point point2 = point1;
System.out.println(“ point1: “ + point1);
System.out.println(“ point1: “ + point2);
}
}
در مثال بالا ما از کلاس Point متعلق به پکیج java.awt استفاده کردهایم. با اجرا کردن قطعه کد بالا میتوانیم خروجی زیر را مشاهده کنیم:
point1: java.awt.Point{ x = 1, y = 1}
point2: java.awt.Point( x = 1, y = 1}
حال فرض کنید مقدار point1 را به شکل زیر تغییر دهیم:
package com.hamed;
import java.awt.*;
public class Main{
public static void main(String[] args){
Point point1 = new Point(1,1);
Point point2 = point1;
point1.x = 2;
point1.y = 5;
System.out.println(“ point1: “ + point1);
System.out.println(“ point1: “ + point2);
}
}
با اجراکردن این کد با خروجی زیر مواجه خواهید شد:
point1: java.awt.Point{ x = 2, y = 5}
point2: java.awt.Point( x = 2, y = 5}
برخلاف انواع داده اولیه که در بخش قبلی درباره آنها صحبت کردیم زمانی که شما مقادیر متغیر point1 را تغییر میدهیم مقادیر متغیر point2 نیز تغییر پیدا میکنند. حال اجازه دهید بررسی کنیم که در پسزمینه دقیقا چه اتفاقی میافتد که باعث تغییر متغیر point2 میشود.
در جلسات قبلی از بهترین آموزش جاوا بیان کردیم زمانی که ما از کلمه کلیدی new استفاده میکنیم یک شی یا object از کلاس ما ساخته شده و داخل حافظه استک ذخیره میشود. زمانی که از انواع دادههای اولیه استفاده میکنیم و آنها را مقداردهی کرده و برابر یک قرار میدادیم دقیقا مقدار 1 داخل آن متغیر ذخیره میشد. این در حالی است که در داخل reference typeها مقدار خود شی ذخیره نمیشود و بهجای آن آدرس شی در داخل متغیر ذخیره میشود. مثلا point1 که ما تعریف کرده و آن را مقداردهی کردهایم در داخل حافظه استک دارای یک حافظه میباشد. فرض کنیم این آدرس مثلا برابر عدد 100 است. حال مقداری که داخل متغیر point1 ذخیره میشود در واقع همین آدرس یعنی عدد 100 میباشد. عملکرد این متغیرها تقریبا مانند shrotcutها در کامپیوتر هستند. بهعنوانمثال ممکن است شما یک پوشه 100 گیگابایتی از انواع فیلم و سریال در داخل درایو D خود داشته باشید و قصد داشته باشید که بهراحتی از طریق دسکتاپ به این پوشه دسترسی پیدا کنید. برای این کار کل پوشه خود را کپی و داخل صفحه دسکتاپ قرار نمیدهید بلکه بهجای آن یک shortcut از پوشه خود ساخته و آن را داخل دسکتاپ قرار میدهید.
shortcut پوشهای که شما تعریف میکنید تنها حاوی آدرس پوشه اصلی شما است و اگر آن را کپی کنید همه آنها به یک فایل اشاره خواهند داشت.
حال فرض کنید ما یک متغیر دیگر ساختهایم که نام آن را point2 قرار دادهایم و بهجای این که از کلمه new برای تعریف آن مقدار آن را برابر point1 قرار دادهایم. اتفاقی که در اینجا میافتد این است که سیستم یک حافظه دیگر در داخل استک نمیسازد که مقدار آن را به point2 نسبت دهد بلکه آدرسی که در داخل point1 قرار دارد را در داخل آن ذخیره میکند. بنابراین مقداری که در داخل این متغیر کپی میکند در واقع مقدار اصلی point1 نیست بلکه آدرسی است که مقدار این متغیر در داخل آن ذخیره شده است. به همین علت زمانی که شما آن مقدار را تغییر میدهید متغیر point2 مجددا به همان آدرس اشاره میکند و همین عامل نیز باعث میشود تا مقدار point2 نیز در زمان چاپ شدن با مقدار متغیر point1 برابر باشد.
قسمت قبلی آموزش رایگان java :
تفاوت دادههای پیچیده و دادههای اولیه
قسمت بعدی آموزش رایگان java :
یا جهت مشاهده ویدیوهای اموزشی آموزش رایگان جاوا وارد این صفحه شوید.