Java instanceof
کلمه instanceof در جاوا برای فهمیدن اینکه آیا یک object، اینستنسی از یک نوع خاص (کلاس یا subclass یا اینترفیس) هست یا نه، استقاده میشه.
دقت کنید که استفاده از instanceof با یک متغیر null، مقدار false رو برمی گردونه.
Simple example of java instanceof
class Simple1{
public static void main(String args[]){
Simple1 s=new Simple1();
System.out.println(s instanceof Simple1);//true
}
}
--------------------------------------------
Output:
trueدر این مثال☝️ما current class رو چک میکنیم.
Subclass example of java instanceof
class Animal{
}
class Dog1 extends Animal{//Dog inherits Animal
public static void main(String args[]){
Dog1 d=new Dog1();
System.out.println(d instanceof Animal);
}
}
--------------------------------------------
Output:
trueنوع یک object از subclass، از نوع کلاس پدر هم هست. در این مثال☝️چون کلاس Dog، کلاس Animal رو extend کرده، پس object کلاس Dog هم میتونه به کلاس Dog اشاره کنه و هم کلاس Animal.
instanceof in java with a variable that have null value
class Dog2{
public static void main(String args[]){
Dog2 d=null;
System.out.println(d instanceof Dog2);//false
}
}
--------------------------------------------
Output:
falseدر این مثال☝️object مون null هست.
Downcasting with java instanceof
وقتی نوع Subclass به یه آبجکت از کلاس Parent اشاره کنه بهش میگیم downcasting میگیم.
اگر ما مستقیم اینکارو انجام بدیم، کامپایلر ارور میده.
Dog d=new Animal();//Compilation error
اگر از typecasting استفاده کنیم، ClassCastException در ران تایم throw میشه.
Dog d=(Dog)new Animal();
//Compiles successfully but ClassCastException is thrown at runtime
ولی اگه از instanceof استفاده کنیم، اینکار به راحتی انجام میشه.
Possibility of downcasting with instanceof
به مثال زیر👇توجه کنید.
class Animal { }
class Dog3 extends Animal {
static void method(Animal a) {
if(a instanceof Dog3){
Dog3 d=(Dog3)a;//downcasting
System.out.println("ok downcasting performed");
}
}
public static void main (String [] args) {
Animal a=new Dog3();
Dog3.method(a);
}
}
--------------------------------------------
Output:
ok downcasting performedDowncasting without the use of java instanceof
داون کستینگ میتونه بدونه instanceof انجام بشه،
class Animal { }
class Dog4 extends Animal {
static void method(Animal a) {
Dog4 d=(Dog4)a;//downcasting
System.out.println("ok downcasting performed");
}
public static void main (String [] args) {
Animal a=new Dog4();
Dog4.method(a);
}
}
--------------------------------------------
Output:
ok downcasting performedدر این مثال☝️آبجکتی که a بهش اشاره میکنه، یه آبجکت از کلاس Dog هست. بخاطر همین downcast به راحتی انجام میشه. اما اگر a به Animal اشاره کنه:
Animal a=new Animal();
Dog.method(a);
//Now ClassCastException but not in case of instanceof operator
Understanding Real use of instanceof in java
یه مثال کامل از instanceof👇
interface Printable{}
class A implements Printable{
public void a(){
System.out.println("a method");
}
}
class B implements Printable{
public void b(){
System.out.println("b method");}
}
class Call{
void invoke(Printable p){//upcasting
if(p instanceof A){
A a=(A)p;//Downcasting
a.a();
}
if(p instanceof B){
B b=(B)p;//Downcasting
b.b();
}
}
}//end of Call class
class Test4{
public static void main(String args[]){
Printable p=new B();
Call c=new Call();
c.invoke(p);
}
}
--------------------------------------------
Output:
b method@javach_me
@javadp_me
@java_me
Abstraction in Java
در جاوا Abstraction (به معنی چکیده) به پروسه ای برای مخفی کردن جزئیات پیاده سازی شده و نشون دادن فقط عملکرد اون گفته میشه.
در واقع فقط چیزهای مهم رو نشون میده و کاری با جزئیات داخلی نداره. مثلا ارسال sms، شما فقط متن رو مینویسید و ارسال ش میکنید. و هیچ اطلاعاتی از چگونگی ارسال و دریافت اون خبر ندارید.
میشه گفت Abstraction باعث میشه تا فقط به کاری که object مون انجام میده توجه کنیم نه چگونگی انجام اون کار.
Ways to achieve Abstraction
دوتا راه برای رسیدن به abstraction در جاوا وجود داره
۱- ابسترکت کلاس ۰ تا ۱۰۰٪ abstract class
۲- اینترفیس ۱۰۰٪
Abstract class in Java
کلاس ابسترکت رو میتونیم با استفاده از کلمه abstract در کنار class داشته باشیم. این کلاس باید extend بشه و متودهاش پیاده سازی بشه. و نمی تونیم ازش instance بسازیم.
abstract class A{}abstract method
متودی که به عنوان abstract تعریف میشه و هیچ پیازه سازی ازش نیست.
abstract void printStatus();//no body and abstract
Example of abstract class that has abstract method
abstract class Bike{
abstract void run();
}
class Honda4 extends Bike{
void run(){
System.out.println("running safely..");
}
public static void main(String args[]){
Bike obj = new Honda4();
obj.run();
}
}
--------------------------------------------
Output:
running safely..در این مثال☝️کلاس Bike یه abstract class هست که یه متود abstract داره و توسط کلاس Honda4 پیاده سازی شده.
Understanding the real scenario of abstract class
در این مثال👇Shape یه abstract کلاس هست و توسط کلاس های Rectangle و Circle پیاده سازی شده.
در این مثال اگر ما یه instance از کلاس Rectangle ایجاد کنیم، متود draw از کلاس Rectangle صدا زده میشه.
File: TestAbstraction1.java
abstract class Shape{
abstract void draw();
}
class Rectangle extends Shape{
void draw(){
System.out.println("drawing rectangle");
}
}
class Circle1 extends Shape{
void draw(){
System.out.println("drawing circle");
}
}
class TestAbstraction1{
public static void main(String args[]){
Shape s=new Circle1();
s.draw();
}
}
--------------------------------------------
Output:
drawing circleAnother example of abstract class in java
File: TestBank.java
abstract class Bank{
abstract int getRateOfInterest();
}
class SBI extends Bank{
int getRateOfInterest(){return 7;}
}
class PNB extends Bank{
int getRateOfInterest(){return 8;}
}
class TestBank{
public static void main(String args[]){
Bank b;
b=new SBI();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
b=new PNB();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
}
}
--------------------------------------------
Output:
Rate of Interest is: 7 %
Rate of Interest is: 8 %Abstract class having constructor, data member, methods etc.
یک abstract class میتونه، data member یا abstract method یا method body یا constructor و یا حتی main متود داشته باشه.
به مثال زیر👇توجه کنید.
File: TestAbstraction2.java
abstract class Bike{
Bike(){
System.out.println("bike is created");
}
abstract void run();
void changeGear(){
System.out.println("gear changed");
}
}
class Honda extends Bike{
void run(){System.out.println("running safely..");}
}
class TestAbstraction2{
public static void main(String args[]){
Bike obj = new Honda();
obj.run();
obj.changeGear();
}
}
--------------------------------------------
Output:
bike is created
running safely..
gear changedنکته: اگر یه متود abstract توی یه کلاس باشه، اون کلاس باید abstract باشه. به مثال زیر👇توجه کنید.
class Bike12{
abstract void run();
}
--------------------------------------------
Output:
compile time errorنکته: اگر یه کلاس abstract داشته باشیم که یه متود abstract داشته باشه، وقتی extend ش کنیم، یا باید اون متود رو پیاده سازی کنیم و یا اون کلاس رو هم abstract کنیم.
@java_me
@javach_me
@javadp_me
Interface in Java
یک interface در جاوا، یه طرحی از یه کلاس هست که شامل static constants و abstract method هستش.
در واقع یه راه برای رسیدن به abstraction و همچنین پیاده سازی کردن multiple inheritance در جاوا، اینترفیس هست.
اینترفیس یک رابطه ی IS-A رو نشون میده. و همچنین مثل abstract class نمیشه ازش instance ساخت.
نکته: از جاوا ۸ به بعد، اینترفیس میتونه متود default و static داشته باشه.
نکته: جاوا کامپایلر دو کلمه public و abstract رو قبل از متود در اینترفیس اضافه میکنه. همچنین ۳ کلمه public, static و final هم قبل از data member ها اضافه میشه.
@java_me
@javach_me
@javadp_me
فیلدها در interface به طور پیشفرض public, static و final هستن و متودها هم public و abstract.
@java_me
@javach_me
@javadp_me
@java_me
@javach_me
@javadp_me
Interface in JavaJava Interface Example
در این مثال👇اینترفیس Printable یه متود داره که توسط کلاس A پیاده سازی میشه.
interface printable{
void print();
}
class A6 implements printable{
public void print(){
System.out.println("Hello");
}
public static void main(String args[]){
A6 obj = new A6();
obj.print();
}
}
--------------------------------------------
Output:
HelloJava Interface Example: Drawable
در این مثال 👇اینترفیس Drawable فقط یه متود داره که توسط کلاس های Rectangle و Circle پیاده سازی شده.
در یک سناریو واقعی یه اینترفیس توسط یه نفر نوشته میشه و توسط دیگران به شکل های مختلفی پیاده سازی میشه.
File: TestInterface1.java
//Interface declaration: by first user
interface Drawable{
void draw();
}
//Implementation: by second user
class Rectangle implements Drawable{
public void draw(){
System.out.println("drawing rectangle");
}
}
class Circle implements Drawable{
public void draw(){
System.out.println("drawing circle");
}
}
//Using interface: by third user
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();
d.draw();
}
}
--------------------------------------------
Output:
drawing circle
Multiple inheritance in Java by interface
اگر یک کلاس چندتا interface رو پیاده سازی کنه یا یه interface چندتا interface دیگه رو extend کنه بهش میگیم multiple inheritance.
@java_me
@javach_me
@javadp_me
Forwarded from عبدالرحیم شریفی
Multithreading in Java
ترد کوچکترین واحد پردازش و مالتی تردین یک پروسه هست برای اجرای چندین ترد به صورت هم زمان هست.
از ویژگی های multithreading میشه به share بودن memory بین اونها اشاره کرد. تردها memory جداگونه ای نمیگیرن و زمان اجراشون خیلی سریع هست.
Advantages of Java Multithreading
۱- کاربر رو block یا معطل نمیگذاره.
۲- میتونیم چندین عملیات رو باهم انجام بدیم.
۳- همچنین تردها به هم وابسته نیستن.
۴- اگر یکی شون ارور بده، روی بقیه تاثیری نداره.
۵- همچنین share بودن memory بین اونها.
Life cycle of a Thread (Thread States)
لایف سایکل (life cycle) ترد در جاوا توسط JVM کنترل میشه.
Forwarded from عبدالرحیم شریفی
۵ تا وضعیت برای ترد در جاوا وجود داره:
1- New
2- Runnable
3- Running
4- Non-Runnable (Blocked)
5- Terminated
1- New
2- Runnable
3- Running
4- Non-Runnable (Blocked)
5- Terminated
Forwarded from عبدالرحیم شریفی
وضعیت های thread در جاوا به این ترتیب هستن:
1- New
وضعیت یک ترد وقتی new هست که شما یک instance از کلاس Thread بسازید اما قبل از اینکه متود start رو صدا بزنید.
2- Runnable
وضعیت یک ترد وقتی runnable میشه که متود start صدا زده بشه اما thread scheduler هنوز اونو انتخاب نکرده.
3- Running
وضعیت یک ترد وقتی running میشه که thread scheduler اون رو انتخاب کرده باشه.
4- Non-Runnable (Blocked)
در این وضعیت ترد هنوز زنده هست اما قابل اجرا شدن نیست.
5- Terminated
در این وضعیت ترد متوقف شده یا مرده، در واقع از متود run خارج شده.
1- New
وضعیت یک ترد وقتی new هست که شما یک instance از کلاس Thread بسازید اما قبل از اینکه متود start رو صدا بزنید.
2- Runnable
وضعیت یک ترد وقتی runnable میشه که متود start صدا زده بشه اما thread scheduler هنوز اونو انتخاب نکرده.
3- Running
وضعیت یک ترد وقتی running میشه که thread scheduler اون رو انتخاب کرده باشه.
4- Non-Runnable (Blocked)
در این وضعیت ترد هنوز زنده هست اما قابل اجرا شدن نیست.
5- Terminated
در این وضعیت ترد متوقف شده یا مرده، در واقع از متود run خارج شده.
Forwarded from عبدالرحیم شریفی
Creating Thread
دو راه برای ساخت یک ترد وجود داره:
۱- کلاس Thread رو extend کنیم.
۲- اینترفیس Runnable رو implement کنیم.
Thread class:
کلاس Thread یه سری کانستراکتور و متود داره که میشه باهاشون کارهایی رو روی thread ساخت و انجام داد. خود کلاس Thread ، اینترفیس Runnable رو پیاده سازی کرده.
کانستراکتورهایی که به طور معمول در کلاس Thread استفاده میشه:
1- Thread()
2- Thread(String name)
3- Thread(Runnable r)
4- Thread(Runnable r, String name)
متودهایی که به طور معمول در کلاس Thread استفاده میشه:
1- public void run()
2- public void start()
3- public void sleep(long miliseconds)
4- public void join()
5- public void join(long miliseconds)
6- public int getPriority()
7- public int setPriority(int priority)
8- public String getName()
9- public void setName(String name)
10- public Thread currentThread()
11- public int getId()
12- public Thread.State getState()
13- public boolean isAlive()
14- public void yield()
15- public void suspend()
16- public void resume()
17- public void stop()
18- public boolean isDaemon()
19- public void setDaemon(boolean b)
20- public void interrupt()
21- public boolean isInterrupted()
22- public static boolean interrupted()
۱- برای انجام عملیات توسط thread استفاده میشه.
۲- برای اجرا کردن ترد از این متود استفاده میشه.
۳- باعث میشه تا ترد جاری که در حال اجرا هست برای لحظاتی متوقف بشه.
۴- ؟
۵- ؟
۶- اولویت ترد رو برمی گردونه.
۷- اولویت ترد رو عوض میکنه.
۸- نام thread رو برمی گردونه.
۹- نام ترد رو عوض میکنه.
۱۰- تردی که در حال اجرا هست رو برمی گردونه.
۱۱- آی دی ترد رو برمی گردونه.
۱۲- وضعیت ترد رو برمی گردونه.
۱۳- مشخص میکنه که ترد هنوز زنده ست یا نه.
۱۴- باعث میشه تا تردی که در حال اجرا هست، به صورت موقت متوقف بشه تا بقیه تردها اجرا بشن.
۱۵- برای به تعلیق (suspend) در اوردن ترد استفاده میشه.
۱۶- برای به اجرا در اوردن ترد تعلیق (suspend) شده استفاده میشه.
۱۷- برای stop کردن ترد استفاده میشه.
۱۸- ؟
۱۹- ؟
۲۰- ترد رو قطع میکنه.
۲۱- مشخص میکنه که آیا ترد قطع (interrupted) شده یا نه.
۲۲- مشخص میکنه که آیا ترد جاری قطع (interrupted) شده یا نه.
Runnable interface:
این اینترفیس باید توسط هر کلاسی که میخواد کدی رو توی ترد اجرا کنه، پیاده سازی بشه. این interface فقط یک متود run داره
1- public void run()
۱- برای انجام عملیات توسط thread استفاده میشه.
Starting a thread:
متود start در کلاس Thread برای استارت شدن تردی هست که new شده و این وظایف رو انجام میده: ۱- استارت شدن ترد جدید. ۲- وضعیت ترد runnable میشه. ۳- وقتی یک ترد برای اجرا آماده میشه، هدفش اجرا کردن متود run هست.
1) Java Thread Example by extending Thread class
class Multi extends Thread{
public void run(){
System.out.println("thread is running...");
}
public static void main(String args[]){
Multi t1=new Multi();
t1.start();
}
}
--------------------------------------------
Output:
thread is running...2) Java Thread Example by implementing Runnable interface
class Multi3 implements Runnable{
public void run(){
System.out.println("thread is running...");
}
public static void main(String args[]){
Multi3 m1 =new Multi3();
Thread t1 =new Thread(m1);
t1.start();
}
}
--------------------------------------------
Output:
thread is running...در این مثال☝️ما کلاس Thread رو extend نکردیم. بخاطر همین نیاز هست تا یه instance از کلاس Thread بسازیم و onject کلاسی رو که Runnable رو پیاده سازی کرده بهش بدیم تا بتونه از این طریق متود run رو اجرا کنه
Forwarded from عبدالرحیم شریفی
Sleeping a thread
متود sleep از کلاس Thread، برای متوقف کردن ترد برای یه مدت زمان خاص استفاده میشه.
Example of sleep method in java
class TestSleepMethod1 extends Thread{
public void run(){
for(int i=1;i<5;i++){
try{
Thread.sleep(500);
}catch(InterruptedException e){
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String args[]){
TestSleepMethod1 t1=new TestSleepMethod1();
TestSleepMethod1 t2=new TestSleepMethod1();
t1.start();
t2.start();
}
}
--------------------------------------------
Output:
1
1
2
2
3
3
4
4همین طور که میدونید در یک لحظه فقط یک ترد اجرا میشه. بخاطر همین وقتی در این مثال☝️یک ترد برای یه مدت زمانی به حالت sleep میره، thread shedular یه thread دیگه رو اجرا میکنه و الاآخر.
Forwarded from عبدالرحیم شریفی
Start a thread twice
بعد از start کردن یک thread، اون دیگه نمیتونه دوباره start بشه. اگر همچین کاری انجام بدید یه IllegalThreadStateException پرتاب (throw) میشه.
به مثال زیر 👇توجه کنید.
public class TestThreadTwice1 extends Thread{
public void run(){
System.out.println("running...");
}
public static void main(String args[]){
TestThreadTwice1 t1=new TestThreadTwice1();
t1.start();
t1.start();
}
}
--------------------------------------------
Output:
running
Exception in thread "main" java.lang.IllegalThreadStateExceptionForwarded from عبدالرحیم شریفی
Java Socket Programming
جاوا سوکت programming برای ارتباط بین برنامه هایی که در JRE های متفاوت اجرا میشن، بکار برده میشه.
هم میتونه connection-oriented هم میتونه connection-less باشه.
از کلاس های Socket و ServerSocket برای connection-oriented و از کلاس های DatagramSocket و DatagramPacket برای connection-less استفاده میشه.
کلاینت در سوکت programming باید دوتا چیز رو بدونه:
۱- آی پی سرور
۲- شماره پورت (port number)
Socket class
این کلاس برای ساخت socket client استفاده میشه، و ۳ متود مهم داره:
1- public InputStream getInputStream()
2- public OutputStream getOutputStream()
3- public synchronized void close()
۱- از سوکت، InputStream رو برای ورود اطلاعات میگیره.
۲- از سوکت، OutputStream رو برای خروجی اطلاعات میگیره.
۳- سوکت رو می بنده.
ServerSocket class
این کلاس برای ساخت socket server استفاده میشه که با کلاینت ها در ارتباط هست، و دوتا متود مهم داره:
1- public Socket accept()
2- public synchronized void close()
۱- یه سوکت برمی گردونه و یه ارتباط بین سرور و کلاینت برقرار میکنه.
۲- سوکت سرور رو می بنده.
Example of Java Socket Programming
در این مثال👇با استفاده از socket programming یه پیام از کلاینت ارسال میشه و سرور اونو دریافت میکنه.
File: MyServer.java
import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(6666);
Socket s=ss.accept();
DataInputStream dis=new DataInputStream(s.getInputStream());
String str=(String)dis.readUTF();
System.out.println("message= "+str);
ss.close();
}catch(Exception e){
System.out.println(e);
}
}
}
File: MyClient.java
import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",6666);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){
System.out.println(e);
}
}
}
برای اجرا کردن این مثال☝️هر فایل (برنامه) رو به صورت جداگانه اجرا کنید.
Example of Java Socket Programming (Read-Write both side)
در این مثال👇ابتدا کلاینت، یه متنی رو برای سرور می فرسته. وقتی سرور متن رو دریافت میکنه، اونو پرینت میکنه. سپس سرور یه متنی رو برای کلاینت می فرسته و کلاینت پس از دریافت، اونو پرینت میکنه.
File: MyServer.java
import java.net.*;
import java.io.*;
class MyServer{
public static void main(String args[])throws Exception{
ServerSocket ss=new ServerSocket(3333);
Socket s=ss.accept();
DataInputStream din=new DataInputStream(s.getInputStream());
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str="",str2="";
while(!str.equals("stop")){
str=din.readUTF();
System.out.println("client says: "+str);
str2=br.readLine();
dout.writeUTF(str2);
dout.flush();
}
din.close();
s.close();
ss.close();
}
}
File: MyClient.java
import java.net.*;
import java.io.*;
class MyClient{
public static void main(String args[])throws Exception{
Socket s=new Socket("localhost",3333);
DataInputStream din=new DataInputStream(s.getInputStream());
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str="",str2="";
while(!str.equals("stop")){
str=br.readLine();
dout.writeUTF(str);
dout.flush();
str2=din.readUTF();
System.out.println("Server says: "+str2);
}
dout.close();
s.close();
}
}