تیکه پاره های جاوا
526 subscribers
93 photos
24 videos
7 files
58 links
سلام خوش اومدید. اینجا یادداشت ها و تکه های جاوا رو کنار هم قرار میدیم :) مطالب کاملا اختصاصی و دستنویس هستند. کپی فقط با ذکر منبع و آیدی کانال❤️

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
💠 بلاک محلی (local block):
🔅 بلاک کدی که داخل بلاک یک متد، کنستراکتور یا حتی داخل بدنه بلاک دیگر(بلاک تو در تو) ساخته شود، به آن بلاک محلی گفته میشود. برای مثال:

public class Main {
public static void main(String[] args) {
{//localBlock
int x = 0;
System.out.println("Hello x = "+x);
}
}
}
🔅 این نوع بلاک فقط زمانی اجرا میشود که متد، کنستراکتور یا بلاک در برگیرنده آن اجرا شود.

در نظر داشته باشید که فقط در محدوده خود بلاک قابل دسترسی هستند. در نتیجه کد زیر خطای کمپایلر به همراه خواهد داشت.
{
int x = 0;
x++;
}
//x cannot be used outside that block
System.out.println(x);

نمیتوانید دو متغیر همنام، یکی قبل از بلاک و یکی داخل بلاک همزمان داشته باشید. برای مثال بلاک زیر هم خطای کمپایلر خواهد داشت:
public class Main {
public static void main(String[] args) {
int num = 20;
{
// Invalid. A compile-time error.
int num = 30;
}
}
}

———
#block
☕️@PIECEJAVA
👍10
💠 رفتار عجیب رشته ها در ترکیب با اعداد

تکه کد زیر را در نظر بگیرید:
String s = 1 + 2 + " My String " + 3 + 4 + 5;
System.out.println(s);
———
⚙️ OUTPUT
3 My String 345
——--- -
🔴Question
#چرا 2 عدد اول با هم جمع میشوند ولی سه عدد آخر (مانند رشته ها) به هم وصل میشوند؟
———-- -
🟢Answer
در بحث رشته ها وقتی از داده ای استفاده میشود، داده در نهایت به رشته تبدیل میشود. برای مثال با رشته زیر
"String" + 1
مانند رشته زیر در نهایت رفتار میشود:
"String" + "1"

اما اگر هیچ رشته ای نداشته باشیم، پلاس بعنوان عملگر حسابی در بین داده ها درنظر گرفته میشود و بعد از محاسبات، نتیجه نهایی تبدیل به رشته میشود. در نتیجه خروجی زیر رشته 3 خواهد بود:
String str = 1+2; // "3"
———-- -
🟡Conclusion

رشته ها از چپ به راست خوانده میشوند. پس میتوان رشته بالا را میتوان بصورت زیر دسته بندی کرد:
(((((1 + 2) + " My String ")+ 3) + 4) + 5)
در نتیجه اولین + بعنوان عملگر حسابی در نظر گرفته میشود، زیرا هنوز به رشته ای نرسیده ایم پس دو عدد را با هم جمع میکند و سپس به رشته تبدیل میکند. + دوم رشته 3 و "My String" را به هم وصل میکند. به همین ترتیب + های بعدی رشته های 3، 4 و 5 را به رشته اصلی وصل میکنند.


در نهایت اگر میخواهید + بین 3 و 4 و 5 بعنوان عملگر حسابی در نظر گرفته شود، این سه عدد را درون یک پرانتز قرار دهید:
1 + 2 + "My String " + (3 + 4 + 5)

☕️ @PIECEJAVA
👍151
بنظرتون خروجی کد بالا کدوم گزینه میشه؟
Anonymous Quiz
27%
ABCabc
6%
ABC
57%
abcabc
10%
abc
👏101👎1
💬 دوستان اگه در رابطه با گیت، توسعه نرم افزار و در کل در رابطه با محدودیت های اینترنت به مسئله خوردین، حتما یبار به آدرس زیر سر بزنید:

🔗 https://github.com/freedomofdevelopers/fod

☕️ @pieceJava
👏7
💠 در جاوا پارامتر ها چگونه به متد ها ارسال میشوند؟

💬 یکی از مهم ترین سوالات خیلی مهم اینه که آیا جاوا Call By Value هست یا Call By Reference ؟
خب اول باید بگم که جاوا call by value هست. اما این اصطلاحات به چه معناست؟

🔶 در جاوا Call By Value یعنی از مقادیر ورودی به متد(پارامتر های ورودی)، یک کپی گرفته میشود و تمامی اعمال بر روی کپی مقادیر ورودی انجام میشود و نه خود مقادیر ورودی. در نتیجه مقادیر ورودی دچار تغییر نمیشوند. برای مثال:
class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a = "+a + "\t b = "+b);
swap(a,b);
System.out.println("swap a and b...");
System.out.println("a = "+a + "\t b = "+b);
}
static void swap(int a,int b){
int temp = a;
a = b;
b= temp;
}
}
—————
⚙️ OUTPUT

a
= 1 b = 2
swap a and b...
a = 1 b = 2
همانطور که میبینید در اصل مقادیر هیچ تغییری ایجاد نشده است.

🔶 در مقابل Call By Reference هم مقادیر ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند. در نتیجه تغییری درون متد اعمال شود، این تغییرات بر روی ورودی تاثیر مستقیم خواهد داشت.( یعنی اگه جاوا call By Reference بود پس متد swap باید برای a و b عمل میکرد )

اما یک ابهام وجود دارد. اینکه چرا در برنامه زیر، مقدار x در آبجکت ذخیره شده به عدد 475 تغییر پیدا میکند؟

class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeX(t);
System.out.println("Change X Value...");
System.out.println("t.x = "+t.x);
}
static void changeX(Test t) {t.x = 475;}

}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————
⚙️ OUTPUT

t.x = 1
Change X Value...
t.x = 475


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


💬 پس اگه ورودی و کپی ایجاد شده هر دو آدرسشون به یه خونه اشاره کنن، این تغییر صورت میگیره اما اگر سعی کنیم آدرس یه آبجکت دیگه رو به متغیر پاس بدیم، روی ورودی اصلی هیچ تغییری اعمال نمیشه. مثلا:
class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeObject(t);
System.out.println("Change Object...");
System.out.println("t.x = "+t.x);
}
static void changeObject(Test t) {
t = new Test(10);
}
}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————
⚙️ OUTPUT

t.x = 1
Change Object...
t.x = 1
———
#pass_by_reference #pass_by_value
#call_by_value #call_by_reference
☕️ @PIECEJAVA
👍7
مثال های استفاده شده
Call By Value / Call By Reference
☕️ @PIECEJAVA
7
This media is not supported in your browser
VIEW IN TELEGRAM
یه مثال خیلی باحال از call by value و call by reference😄

☕️ @PIECEJAVA
👍121
تیکه پاره های جاوا
مطالب کانال تا چه حد براتون واضح و مفهومه؟
راستی تا یادم نرفته اگه نظر / انتقاد یا پیشنهادی هم دارین خوشحال میشم باهام در میون بزارید❤️ ^ ^
~ @MRVJ475
9
This media is not supported in your browser
VIEW IN TELEGRAM
#یکبار_برای_همیشه
چرا cmd کمپایلر جاوا (javac) یا java -version رو شناسایی نمیکنه؟

❗️بررسی خطای
'****' is not recognized as an internal or external command,
operable program or batch file.
———
☕️@pieceJava
👏81
#پیشنهاد
💠 معرفی دوره جاوا

یکی از بهترین دوره های جاوا (متدلوژی برنامه نویسی) که دیدم :)
دوره از پروفسور مهران سهامی هستش از دانشگاه استنفورد و البته به زبان انگلیسیه.

کاملا قابل فهم و واضح هست. البته چون خودم دورشون روکامل ندیدم، نمیتونم در مورد پایان دوره چیزی بگم. اما 5 قسمتی که دیدم واقعا عالی بود.
این رو هم بگم که اگه این دوره رو انتخاب میکنید، دقیق و درست باهاش همراه بشید. مثلا تمرین ها و هرچیزی که میگه رو حتما انجام بدید (کل فایل های لازم داخل لینک زیر، از جمله تمرین ها، متن سخنرانی و ... موجوده)

× قبل از شروع دوره حتما Course Description رو بخونید...

🔸 آدرس دوره:
| آدرس سایت دوره |

🔻 مشاهده فیلم ها از طریق یوتیوب (همراه با زیرنویس زبان اصلی):
| آدرس پلی لیست یوتیوب دوره |
8
💠 تفاوت runtime error و compile time error و logical error
5
تیکه پاره های جاوا
💠 تفاوت runtime error و compile time error و logical error
⚠️ خطای رانتایم
خطای رانتایم در زمان اجرا رویت میشود. برای مثال:
- زمانی که کاربر از طریق اسکنر یک داده نامعتبر را وارد کند (فرضا بجای عدد رشته رو وارد کنه).
- تبدیل رشته حاوی کاراکتر به عدد: Integer.parsInt("a1")
- زمانی که حافظه استک سر ریز شود
- تقسیم 1 بر 0

💡این نوع خطا اکثر اوقات بر اساس ورودی های نامعتبر رخ میدهد.

⚠️ خطای کمپایل
خطای کمپایل مربوط به خطا هاییست که پیش از اجرا شدن برنامه رخ میدهد و معمولا خود IDE قبل از اجرای برنامه به شما اخطار میدهد. برای مثال:
- ذخیره یک داده اشتباه در مکان اشتباه:
int name = "Mohammad Reza";

- جا انداختن سمیکالن ;
- جا انداختن آکولاد باز یا بسته یا هر دو {}
- استفاده از کلاسی که هنوز تعریف نشده است
- استفاده از متغیری که هنوز ایجاد نشده است.
- استفاده از متغیری که هنوز مقدار دهی نشده است:
int sum;
System.out.println(sum);
رفع این خطاها عموما بدون هیچ پیچیدگیست. زیرا به کمک کمپایلر جای خطا به شما نشان داده میشود.

⚠️خطای منطقی
یکی از سخت ترین نوع خطا ها خطای منطقیست. در واقع برنامه بدون هیچ مشکلی اجرا و کار میکند اما نتیجه اشتباه را برمیگرداند. در این حالت میگوییم خطای منطقی رخ داده است. برای مثال:

برنامه ای بنویسید که دو عدد 2 و 5 را با هم جمع کند و نمایش دهد:
حالا اگر بین 2 و 5 بجای + از هر عملگر دیگری استفاده کنید، از آنجا که نتیجه اشتباه خواهد بود میگوییم خطای منطقی رخ داده است.

#runtime_error #compile_error
#errors #error #runtime #compile
#logical_error
—————
تیکه پاره های جاوا
@PieceJava
6
#پیشنهاد
💠 پروژه چی بنویسم؟

🔆 اگه دوست دارید پروژه بزنید ولی ایده ای براش ندارید، لینک زیر رو دنبال کنید.
در واقع یه ریپازیتوری که کلی پیشنهاد برای ساختن پروژه مطرح کرده. پروژه ها توی موضوعات مختلفی از جمله اعداد، الگوریتم نویسی، کار با رشته ها، شبکه، کلاس ها، نخ ها، فایل ها، دیتابیس و... دسته بندی شده اند.

ضمنا ناگفته نمونه که سورس پروژه ها از طریق آدرس زیر قابل دسترسیه. تقریبا به اکثر زبان ها موجود هستن:
🔗 پروژه ها
🔗 سورس پروژه ها
@PieceJava
👍64😁1
💠 کلیدواژه var در جاوا

🔆 از بعد جاوای 10 میتوان بجای نوشتن مستقیم نوع داده ها، از کلیدواژه var استفاده کرد.
در نتیجه در خط کد زیر، میتوانید نوع داده یعنی String را
String name = "Mohammad Reza";
با کلید واژه var جایگزین کنید:
var name = "Mohammad Reza";

در این حالت خود کمپایلر نوع داده را تشخیص میدهد.

⁉️ آیا var در جاوا مشابه var در جاوا اسکریپت است؟
جاوا یک زبان statically typed است. یعنی نوع داده ها از همان ابتدا که مشخص میشود، تا آخر برنامه ثابت میماند. در نتیجه var در جاوا کاملا متفاوت از var در جاوا اسکریپت میباشد. در جاوا اسکریپت هر زمان که بخواهید میتوانید نوع داده را تغییر دهید. اما همینکار در جاوا خطای کمپایل خواهد داشت:
var text = "Hello World";
text = 23; // Incompatible types

چند مثال استفاده از var:
1️⃣
Person person = new Person();
var person = new Person();

2️⃣
ArrayList<Integer> numbers = new ArrayList<>();
var numbers = new ArrayList<Integer>();

3️⃣
int[] x = {1,2,3,4,5};
int[] y = new int[10];

var x = new int[]{1,2,3,4,5};
var y = new int[10];


🟡 متغیر از نوع var میتواند فاینال تعریف شود تا از مقداردهی دوباره آن جلوگیری شود:
final var text = "Hello World"
(بر خلاف کاتلین که val برای مقادیر ثابت بود، اینجا چیزی به نام val نداریم و باید از فاینال استفاده کنیم)

⚠️ در حالت های زیر نمیتوانید از var استفاده کنید. در صورت استفاده خطای کمپایل خواهید داشت:
هر کجا که نوع داده برای کمپایلر مبهم باشد:
var a;
var nothing = null;
var lambda = () -> System.out.println("Pity!");
var method = this::someMethod;

متغیر از نوع var بعنوان یک متغیر گلوبال به کار برود.
class Person{
var name;
var adress;
var age;
}

کلیدواژه var تعیین کننده خروجی متد یا نوع ورودی متد باشد.
var myMethod(){

}

void myMethod(var x){

}

#var #keywords
——————-
تیکه پاره های جاوا
@PieceJava
👍122
💠 الگوی طراحی سینگلتون
#الگوی_طراحی
🧩 دیزاین پترن ها یا الگو های طراحی یکسری روش ها و تکنیک ها برای حل یک مسئله خاص هستند. در این قسمت میخواهیم با الگوی سینگلتون برای طراحی کلاس سینگلتون آشنا بشیم

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

☕️ @PieceJava
👍10
▫️ دو نکته کلیدی در هنگام ساخت کلاس سینگلتون باید رعایت شود:
- سطح دسترسی تمامی کنستراکتور های کلاستان را باید پرایوت تعریف کنید تا از این کلاس هیچ نمونه ای قابل ایجاد شدن نباشد.
- در کلاستان یک نمونه استاتیک از همین کلاس تعریف کنید. به گونه ای که دسترسی به این نمونه از طریق یک متد استاتیک صورت گیرد.
برای مثال:

class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}

public static Singleton getInstance() {
return instance;
}
}

حالا یک کلاس سینگلتون ساده ایجاد کرده ایم. پس اگر ما از الگوی سینگلتون در کلاس خود استفاده کرده باشیم کد زیر باید خروجی معادل true داشته باشد: (ترو به معنای برابر بودن هر دو نمونه ایجاد شده یا اشاره هر دو نمونه به یک خانه از حافظه دارد)

public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); //prints true
}
}

کاربرد کلاس سینگلتون
در حالت کلی اگر بخواهید از کلاستان فقط یک نمونه در کل برنامه وجود داشته باشد میتوانید از این الگو استفاده کنید. برای مثال برای جابجایی داده ها در میان کلاس ها و یا برای اتصال برنامه به دیتابیس میتوانیم از این الگو استفاده کنیم. برای مثال:
import java.util.NoSuchElementException;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Database db1;
// refers to the only object of Database
db1= Database.getInstance();
db1.getConnection();
}
}
class Database {
private static Database dbObject;
private Database() {
}
public static Database getInstance() {

// create object if it's not already created
if(dbObject == null) {
dbObject = new Database();
}

// returns the singleton object
return dbObject;
}
public void getConnection() {
System.out.println("You are now connected to the database.");
}
}

پس با توجه به الگوی سینگلتون، در برنامه بالا کافیست فقط یکبار متد getInstance صدا زده شود تا برنامه به دیتابیس متصل شود.

💬 مثال اول اگه دقت کرده باشید، instance رو بیرون از متد getInstance مقدار دهی کردیم درصورتی که تو مثال بعدی، اینکار رو درصورت نال بودن dbObject در متد getInstance انجام دادیم. به اینکار Lazy Loading گفته میشه. یعنی نمونه تنها در زمانی ساخته میشه که لازم باشه که همین میتونه باعث صرفه جویی در مصرف منابع بشه.

#design_patterns #singleton #gof
————
☕️ @PIECEJAVA
👍10