Java
46 subscribers
42 photos
36 files
137 links
Download Telegram
Super Keyword in Java


کلمه super در جاوا اشاره که کلاس پدر (parent class object) داره.
وقتی شما یه اینستنس از subclass میسازید، یه اینستنس از parent class هم ساخته میشه

Usage of java super Keyword
۱- دسترسی به instance variable های کلاس پدر
۲- صدا زدن متودهای کلاس پدر
۳- صدا زدن کانستراکتور کلاس پدر

1) super is used to refer immediate parent class instance variable
class Animal{  
String color="white";
}
class Dog extends Animal{
String color="black";
void printColor(){
System.out.println(color);//prints color of Dog class
System.out.println(super.color);//prints color of Animal class
}
}
class TestSuper1{
public static void main(String args[]){
Dog d=new Dog();
d.printColor();
}
}
--------------------------------------------
Output:
black
white

در این مثال☝️در هر دو کلاس Dog و Animal یه فیلد به اسم color داریم، ولی تونستیم با استفاده از super در کلاس Dog به فیلد color در کلاس Animal دسترسی پیدا کنیم.

2) super can be used to invoke parent class method
class Animal{  
void eat(){
System.out.println("eating...");
}
}
class Dog extends Animal{
void eat(){
System.out.println("eating bread...");
}
void bark(){
System.out.println("barking...");
}
void work(){
super.eat();
bark();
}
}
class TestSuper2{
public static void main(String args[]){
Dog d=new Dog();
d.work();
}
}
--------------------------------------------
Output:
eating...
barking...

در این مثال☝️در هر دو کلاس Dog و Animal یه متود به اسم eat داریم، درواقع override ش کردیم، ولی تونستیم با استفاده از super در کلاس Dog متود eat رو در کلاس Animal صدا بزنیم.

3) super is used to invoke parent class constructor
class Animal{  
Animal(){
System.out.println("animal is created");
}
}
class Dog extends Animal{
Dog(){
super();
System.out.println("dog is created");
}
}
class TestSuper3{
public static void main(String args[]){
Dog d=new Dog();
}
}
--------------------------------------------
Output:
animal is created
dog is created

در این مثال☝️با استفاده super در کلاس Dog تونستیم کانستراکتور Animal رو صدا بزنیم

@javadp_me
@java_me
Instance initializer block


برای مقداردهی اولیه یا initialize کردن دیتا در جاوا به کار میره. زمانی این بلاک اجرا میشه که یک آبجکت از کلاس ساخته بشه.
درسته که امکان مقداردهی به صورت مستقیم به متغیرها وجود داره ولی میشه با استفاده از این بلاک کارهای بیشتری در زمان مقداردهی اولیه انجام داد.

Example of instance initializer block
class Bike7{  
int speed;

Bike7(){
System.out.println("speed is "+speed);
}

{
speed=100;
}

public static void main(String args[]){
Bike7 b1=new Bike7();
Bike7 b2=new Bike7();
}
}
--------------------------------------------
Output:
speed is 100
speed is 100


دقت کنید که در جاوا ۳تا مکان برای انجام دادن یک رفتار یا یک کار وجود داره.
۱- متود
۲- کانستراکتور
۳- بلاک

- سوال
اول instance initializer block اجرا میشه یا کانستراکتور؟
class Bike8{  
int speed;

Bike8(){
System.out.println("constructor is invoked");
}

{
System.out.println("instance initializer block invoked");
}

public static void main(String args[]){
Bike8 b1=new Bike8();
Bike8 b2=new Bike8();
}
}
--------------------------------------------
Output:
instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

همین طور که در این مثال☝️میبینید اول instance initializer block اجرا میشه، اما صبر کنید، این بلاک در زمان ساخته شدن آبجک صدا زده میشه و در واقع جاوا کامپایر این بلاک رو کپی میکنه توی کانستراکتور، درست بعد از super()
پس اول کانستراکتور صدا زده میشه.

نکته:
دقت کنید که کدهای توی این بلاک توسط جاوا کامپایبر توی همه کانستراکتورها کپی میشه.

@javadp_me
@java_me
همین طور که میبینید جاوا کامپایلر کدی که در بلاک هست رو توی کانستراکتور و بعد از super() کپی میکنه

@javadp_me
@java_me
Instance initializer block


Example 1:
class A{  
A(){
System.out.println("parent class constructor invoked");
}
}
class B2 extends A{
B2(){
super();
System.out.println("child class constructor invoked");
}

{
System.out.println("instance initializer block is invoked");
}

public static void main(String args[]){
B2 b=new B2();
}
}
--------------------------------------------
Output:
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked


Example 2:
class A{  
A(){
System.out.println("parent class constructor invoked");
}
}

class B3 extends A{
B3(){
super();
System.out.println("child class constructor invoked");
}

B3(int a){
super();
System.out.println("child class constructor invoked "+a);
}

{
System.out.println("instance initializer block is invoked");
}

public static void main(String args[]){
B3 b1=new B3();
B3 b2=new B3(10);
}
}
--------------------------------------------
Output:
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked 10

در این دو مثال☝️تربیت اجرا بین instance initializer block و کانستراکتور مشخص شده است

@javadp_me
@java_me
Final Keyword In Java


کلمه final در جاوا برای محدود کردن به کار میره و در ۳جا استفاده داره
۱- متغیر ۲- متود ۳- کلاس

اگر متغیر مون final باشه و بهش مقدار ندیم بهش میگن blank final variable یا uninitialized final variable و فقط میشه تو کانستراکتور مقداردهیش کرد. همچنین blank final variable میتونه استاتیک باشه که در این صورت مقداردهی این متغیر توی static block انجام میشه.

1) Java final variable
اگر ما یه متغیر رو final کنیم دیگه نمیتونیم مقدارش رو عوض کنیم. در واقع داریم ثابت ش میکنیم.

Example of final variable
class Bike9{  
final int speedlimit=90;
void run(){
speedlimit=400;
}
public static void main(String args[]){
Bike9 obj=new Bike9();
obj.run();
}
}
--------------------------------------------
Output:
Compile Time Error

همین طور که در این مثال☝️میبینید ما متغیر speedlimit رو داریم که final شده و می خوایم در متود run مقدارش رو عوض کنیم ولی نمیتونیم این کار رو انجام بدیم.

2) Java final method
اگر یک متود final باشه، نمیتونیم اون رو override کنیم.

Example of final method
class Bike{  
final void run(){System.out.println("running");}
}

class Honda extends Bike{
void run(){
System.out.println("running safely with 100kmph");
}

public static void main(String args[]){
Honda honda= new Honda();
honda.run();
}
}
--------------------------------------------
Output:
Compile Time Error


3) Java final class
اگر یک کلاس final باشه، نمیتونیم اون رو extend کنیم.

Example of final class
final class Bike{}  

class Honda1 extends Bike{
void run(){
System.out.println("running safely with 100kmph");
}

public static void main(String args[]){
Honda1 honda= new Honda();
honda.run();
}
}
--------------------------------------------
Output:
Compile Time Error


- سوال
- آیا final متود ارث برده میشه؟
آره، فاینال متود ارث برده میشه ولی قابل override نیست.

- آیا میتونیم blank final variable مقداردهی کنیم؟
آره، اما فقط از طریق کانستراکتور میتونیم این کار رو انجام بدیم.

Example blank final variable
class Bike10{  
final int speedlimit;//blank final variable

Bike10(){
speedlimit=70;
System.out.println(speedlimit);
}

public static void main(String args[]){
new Bike10();
}
}
--------------------------------------------
Output:
70

در این مثال☝️میبینیم که blank final variable فقط از طریق کانستراکتور مقداردهی میشه.

Example static blank final variable
class A{  
static final int data;//static blank final variable
static{ data=50;}
public static void main(String args[]){
System.out.println(A.data);
}
}

در این مثال☝️میبینیم که static blank final variable فقط از طریق استاتیک بلاک مقداردهی میشه.

- فاینال پارامتر final parameter چیست؟
اگر پارامتر ورودی یک متود final باشه، نمی تونیم مقدار اون رو عوض کنیم.
Example:
class Bike11{  
int cube(final int n){
n=n+2;//can't be changed as n is final
n*n*n;
}
public static void main(String args[]){
Bike11 b=new Bike11();
b.cube(5);
}
}
--------------------------------------------
Output:
Compile Time Error


- آیا میتونیم یک کانستراکتور final داشته باشیم؟
خیر، چون کانستراکتور رو نمیتونیم override کنیم که بخوایم با final کردن اون از این کار جلوگیری کنیم.

@javadp_me
@java_me
Polymorphism in Java


پولیمورفیزم در جاوا در واقع انجام یک کار با استفاده از روش های مختلف هست.
دو نوع polymorphism در جاوا وجود داره:
1- compile time polymorphism
2- runtime polymorphism
که می تونیم با استفاده از method overloading و method overriding پیاده سازی ش کنیم.

اگر ما از یه متود استاتیک رو overload کنیم، یعنی داریم compile time polymorphism رو پیاده سازی میکنیم.

در اینجا میخوایم runtime polymorphism رو توضیح بدیم.

Runtime Polymorphism in Java
در واقع اجرا شدن متود override شده در زمان runtime رو میگن runtime polymorphism.
تو این حالت متود override شده از طریق reference variable (متغیری که اشاره به object داره) کلاس پدر (superclass)، صدا زده میشه.

بهتره قبل از runtime polymorphism، مفهوم upcasting رو متوجه بشیم.

@javadp_me
@java_me
Upcasting


وقتی reference variable کلاس پدر، به object کلاس بچه، اشاره میکنه بهش upcasting میگیم

class A{}  
class B extends A{}


A a=new B();//upcasting


@javadp_me
@java_me
Polymorphism in Java


Example:
در این مثال👇ما دوتا کلاس Bike و Splendar داریم. کلاس Splendar، کلاس Bike رو extend و متود run رو override میکنه. سپس از طریق reference variable کلاس پدر متود run رو صدا میزنیم و چون reference variable به آبجکت subclass و متود subclass ی که override کرده متود کلاس پدر رو، اشاره میکنه، بخاطر همین متود subclass در زمان runtime صدا زده میشه. و بخاطر همین هم بهش میگن runtime polymorphism.
class Bike{  
void run(){System.out.println("running");}
}
class Splender extends Bike{
void run(){
System.out.println("running safely with 60km");
}

public static void main(String args[]){
Bike b = new Splender();//upcasting
b.run();
}
}
--------------------------------------------
Output:
running safely with 60km



@javadp_me
@java_me
Polymorphism in Java


Example:
در این مثال👇کلاس Bank یه متود به اسم getRateOfInterest (نرخ بهره) داره. اما ممکنه این نرخ در هر بانکی متفاوت هست.
class Bank{  
float getRateOfInterest(){
return 0;
}
}
class SBI extends Bank{
float getRateOfInterest(){
return 8.4f;
}
}
class ICICI extends Bank{
float getRateOfInterest(){
return 7.3f;
}
}
class AXIS extends Bank{
float getRateOfInterest(){
return 9.7f;
}
}
class TestPolymorphism{
public static void main(String args[]){
Bank b;
b=new SBI();
System.out.println("SBI Rate of Interest: "+b.getRateOfInterest());
b=new ICICI();
System.out.println("ICICI Rate of Interest: "+b.getRateOfInterest());
b=new AXIS();
System.out.println("AXIS Rate of Interest: "+b.getRateOfInterest());
}
}
--------------------------------------------
Output:
SBI Rate of Interest: 8.4
ICICI Rate of Interest: 7.3
AXIS Rate of Interest: 9.7


توجه کنید در مثال👇قبلی
https://t.me/java_me/164
فقط از متود overriding استفاده کردیم، بدون استفاده از upcasting. ولی اینجا از هر دوتا استفاده کردیم

@javadp_me
@java_me
Polymorphism in Java


Java Runtime Polymorphism with Data Member

رانتایم polymorphism فقط براساس متود هست و قابل پیاده سازی با data member ها نیست.

در این مثال👇هر دو کلاس یه عضو به اسم speedlimit دارن. درسته ما میتونیم از طریق reference variable به datamember دسترسی داشته باشیم ولی چون datamember قابل override شدن نیست، پس همیشه به datamember کلاس پدر دسترسی پیدا میکنیم.
class Bike{  
int speedlimit=90;
}
class Honda3 extends Bike{
int speedlimit=150;

public static void main(String args[]){
Bike obj=new Honda3();
System.out.println(obj.speedlimit);//90
}
}
--------------------------------------------
Output:
90


Java Runtime Polymorphism with Multilevel Inheritance
class Animal{  
void eat(){
System.out.println("animal is eating...");
}
}
class Dog extends Animal{
void eat(){
System.out.println("dog is eating...");
}
}
class BabyDog1 extends Dog{
public static void main(String args[]){
Animal a=new BabyDog1();
a.eat();
}
}
--------------------------------------------
Output:
dog is eating...

در مثال بالا☝️چون کلاس BabyDog متود eat رو override نکرده، بخاطر همین متود eat کلاس Dog صدا زده میشه.

@javadp_me
@java_me
Java Challenge Channel

https://t.me/javach_me
Forwarded from Java in Action
Renaming Java EE!
Have a good idea? Share it here. https://groups.google.com/forum/#!msg/javaee-guardians/RA4jEvFfmAs/9klqLAy-AAAJ … …

A community initiative #javaee #java
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 performed


Downcasting 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 circle


Another 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