آموزش برنامه نویسی اندروید

saalek110

Well-Known Member
پس دیدیم که در کلاس حاوی main هم می توانیم از کلاسش شی بسازیم و متدها را فرا بخوانیم.
ولی کدوم بهتره؟ در یک فایل دیگه ببریم کارهامون را و یا در کلاس حاوی main متدها را بسازیم.
شاید سایت w3schools برای راحتی خودش در همان تک فایل همه چیز را پیاده کرده ولی من(سالک) در دو فایل و دو کلاس کار را پیاده کردم.
شاید بعضی کارها در فایل اول بهتر باشد. ولی مسلما فایلهای دوم و سوم و ... می تواند در توسعه برنامه به ما کمک کند.
 

saalek110

Well-Known Member
Constructor یا سازنده:
متدی است که به محض ایجاد شی خودبخود اجرا می شود.
این متد همنام کلاس است.

کد هر دو فایل را یکجا پست می کنم ولی اشتباه نکنید هر قسمت در یک فایل جاوا بوده.
JavaScript:
public class second {
       int x;

      // Create a class constructor for the MyClass class
      public second() {
        x = 5;  // Set the initial value for the class attribute x
      }
  
}





public class MyClass { 
public static void main(String[] args) {
   System.out.println("Hello World");

   second myObj = new second(); // Create an object of class MyClass (This will call the constructor)
   System.out.println(myObj.x); // Print the value of x=5
 
   }
}
ما در main از کلاس فایل دوم شی ساختیم. و انتظار داریم متد سازنده متغیر کلاس را بلافاصله مقدار دهی کرده باشد.

نتیجه اجرا:
Hello World
5

جلوی سازنده نوع خروجی تابع را نباید نوشت مثلا void.
ولی متد سازنده می تواند ورودی بگیرد.
 
آخرین ویرایش:

saalek110

Well-Known Member
گفتیم متد سازنده می تواند ورودی بگیرد. او از این ورودی ها برای مقدار دهی متغیرهای کلاس استفاده می کند.
کد همه چیز در یک کلاس:
JavaScript:
public class MyClass {
  int x;

  public MyClass(int y) {
    x = y;
  }

  public static void main(String[] args) {
    MyClass myObj = new MyClass(5);
    System.out.println(myObj.x);
  }
}

// Outputs 5
 

saalek110

Well-Known Member
و هر چندتا دوست داشتید می توانید به سازنده ورودی بدهید.
در کد زیر که همه اتفاقات در یک کلاس می افتد دو متغیر رشته ای و عددی داریم که سازنده با ورودی های خود اونها را مقدار دهی می کند.
JavaScript:
public class Car {
  int modelYear;
  String modelName;

  public Car(int year, String name) {
    modelYear = year;
    modelName = name;
  }

  public static void main(String[] args) {
    Car myCar = new Car(1969, "Mustang");
    System.out.println(myCar.modelYear + " " + myCar.modelName);
  }
}

// Outputs 1969 Mustang
 

saalek110

Well-Known Member
خلاصه بحث:
ما یک کلاس دیگر در یک فایل دیگر ساختیم. داخل آن کلاس 3 نوع متد وجود داشت.
aa.jpg

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

saalek110

Well-Known Member
تا اینجا یک کلاس در بیرون کلاس خودمان داشتیم و سعی داشتیم از متدهای اون استفاده کنیم.

حالا اگر یک کلاس سوم در فایل سومی اضافه شود و از کلاس دوم ارث ببرد میشه توارث.

aa.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
کلاس والد و فرزند:
کد:
subclass (child) - the class that inherits from another class
superclass (parent) - the class being inherited from
کلاس والد و کلاس بچه. یا بگیم کلاس پدر و کلاس فرزند.
پس کلاس فرزند از کلاس پدر به ارث می برد.
سوپرکلاس و ساب کلاس هم میگن.

a3.png
 

saalek110

Well-Known Member
یک مثال ساده توارث:
منبع:Inheritance in Java - GeeksforGeeks
فرض کنید در فایل دوم من این باشه:
JavaScript:
class one
{
    public void print_geek()
    {
        System.out.println("Geeks");
    }
}
و در فایل سومم این باشه:
JavaScript:
class two extends one
{
    public void print_for()
    {
        System.out.println("for");
    }
}
و فایل اول که حاوی main است این طوری باشد:
JavaScript:
// Driver class
public class Main
{
    public static void main(String[] args)
    {
        two g = new two();
        g.print_geek();
        g.print_for();
        g.print_geek();
    }
}
نتیجه اجرا:
Geeks
for
Geeks
inheritance1.png

خوب. این شد توارث.
کلمه extends باعث توارث کلاس دومی از اولی است.
در main از کلاس دوم شی ساخته شده یعنی از کلاس فرزند.
در main می بینیم که هم از متد کلاس پدر استفاده کرده و هم از متد کلاس فرزند.
 
آخرین ویرایش:

saalek110

Well-Known Member
JavaScript:
class Animal{
void eat(){System.out.println("eating...");}
}
class Dog extends Animal{
void bark(){System.out.println("barking...");}
}
class TestInheritance{
public static void main(String args[]){
Dog d=new Dog();
d.bark();
d.eat();
}}
منبع
نتبجه اجرا:
barking...
eating...
تکرار مثال قبل:
کلاس حیوان متد خوردن دارد
کلاس سگ که از کلاس حیوان مشتق میشه متد پارس کردن دارد.
شی ما که از کلاس سگ ساخته شده می خورد و پارس می کند.
سه کلاس را در 3 فایل بسازید نه در یک فایل.
 

saalek110

Well-Known Member
حالا اگر کلاس توله سگ را از کلاس سگ مشتق کنید میشه وراثت چند طبقه.
Multilevel Inheritance
Inheritance in Java - Javatpoint
JavaScript:
class Animal{ 
void eat(){System.out.println("eating...");} 
} 
class Dog extends Animal{ 
void bark(){System.out.println("barking...");} 
} 
class BabyDog extends Dog{ 
void weep(){System.out.println("weeping...");} 
} 
class TestInheritance2{ 
public static void main(String args[]){ 
BabyDog d=new BabyDog(); 
d.weep(); 
d.bark(); 
d.eat(); 
}}
weeping...
barking...
eating...
a1.pngdd.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
شاید نیازی به این مثال دیگه نباشه و تکراری باشد ولی برای تمرین خوبه:
منبع
JavaScript:
class Calculation {
   int z;

   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }

   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }

   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}
کلاس پدر متدهای جمع و تفریق داره . کلاس فرزند متد ضرب داره.
شی حاصل از کلاس فرزند هر 3 متد را می تواند استفاده کند.
من کدهای فوق را در 3 فایل جاوا ذخیره کردم و اجرا کردم. نتیجه اجرا:
The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200
.
 
آخرین ویرایش:

saalek110

Well-Known Member
a10.png
بحث override: کلاس فرزند متدی از متدهای کلاس پدر را تغییر می دهد.
JavaScript:
// A Simple Java program to demonstrate
// method overriding in java

// Base Class
class Parent
{
    void show() { System.out.println("Parent's show()"); }
}

JavaScript:
// Inherited class
class Child extends Parent
{
    // This method overrides show() of Parent
    @Override
    void show() { System.out.println("Child's show()"); }
}
JavaScript:
// Driver class
class Main
{
    public static void main(String[] args)
    {
        // If a Parent type reference refers
        // to a Parent object, then Parent's
        // show is called
        Parent obj1 = new Parent();
        obj1.show();

        // If a Parent type reference refers
        // to a Child object Child's show()
        // is called. This is called RUN TIME
        // POLYMORPHISM.
        Parent obj2 = new Child();
        obj2.show();
    }
}
 
آخرین ویرایش:

saalek110

Well-Known Member
a10.png
شرح پست قبل:
کلاس فرزند متد کلاس والد را اورراید کرده. یعنی آن را تغییر داده.
نوشتن کلمه @Override باعث کمک به شما میشه تا ورودی و خروجی های متد مذکور را اشتباه ننویسید. چون اگر اشتباه بنویسید به شما پیامی داده می شود که یک چیز را اشتباهی تغییر دادید و دارید متد دیگری می سازید.
پس باید ورودی ها و خروجی متد عینا شبیه متد کلاس والد باشد.
من اجرا کردم. خروجی:
Parent's show()
Child's show()
b1.png b2.png
من آمدم عمدا خروجی تابع را عوض کردم . به جای void نوشتم int . که طبق شکل بالا می بینید خطا گرفته چون موقع اورراید باید عینا مشخصات متد کلاس والد را بنویسیم.
همان طور که در شکل می بینید من کدها را در 3 فایل با نامهای MyClass و Parent و Child ذخیره کردم.

همچنین دقت کنید که شی دوم چطوری ساخته شده:
a3.png
رفرنس پدر به آبجکت فرزند اشاره می کند. مگر نباید هر دو فرزند باشد؟
سایت منبع این طوری نوشته. و گفته به این پلی موفیسم زمان اجرا می گویند.
و گفته اینکه به کدام نوع آبجکت اشاره کردیم معلوم می کنه کدام متد اجرا بشه. در کد به آبجکت فرزند اشاره شده پس متد فرزند اجرا میشه.
 
آخرین ویرایش:

saalek110

Well-Known Member
a1.png
JavaScript:
// A Simple Java program to demonstrate
// Overriding and Access-Modifiers

class Parent
{
    // private methods are not overridden
    private void m1() { System.out.println("From parent m1()");}
  
    protected void m2() { System.out.println("From parent m2()"); }
}

class Child extends Parent
{
    // new m1() method
    // unique to Child class
    private void m1() { System.out.println("From child m1()");}
  
    // overriding method
    // with more accessibility
    @Override
    public void m2() { System.out.println("From child m2()");}
  
}

// Driver class
class Main
{
    public static void main(String[] args)
    {
        Parent obj1 = new Parent();
        obj1.m2();
        Parent obj2 = new Child();
        obj2.m2();
    }
}
وقتی متدی protected باشد در کلاس فرزند به شکل public می توانیم Override کنیم.
منبع

Output :

From parent m2()
From child m2()
 
آخرین ویرایش:

saalek110

Well-Known Member
a1.png
JavaScript:
// A Java program to demonstrate that
// final methods cannot be overridden

class Parent
{
    // Can't be overridden
    final void show() {  }
}

class Child extends Parent
{
    // This would produce error
    void show() {  }
}
متد final قابل Override نیست.
منبع
Output :

13: error: show() in Child cannot override show() in Parent
void show() { }
^
overridden method is final
 
آخرین ویرایش:

saalek110

Well-Known Member
a1.png
Method hiding about static method

JavaScript:
/* Java program to show that if static method is redefined by
a derived class, then it is not overriding,it is hiding */

class Parent
{
    // Static method in base class which will be hidden in subclass
    static void m1() { System.out.println("From parent static m1()");}

    // Non-static method which will be overridden in derived class
    void m2() { System.out.println("From parent non-static(instance) m2()"); }
}

class Child extends Parent
{
    // This method hides m1() in Parent
    static void m1() { System.out.println("From child static m1()");}

    // This method overrides m2() in Parent
    @Override
    public void m2() { System.out.println("From child non-static(instance) m2()");}

}

// Driver class
class Main
{
    public static void main(String[] args)
    {
        Parent obj1 = new Child();

        // As per overriding rules this should call to class Child static
        // overridden method. Since static method can not be overridden, it
        // calls Parent's m1()
        obj1.m1();

        // Here overriding works and Child's m2() is called
        obj1.m2();
    }
}
متد استاتیک را می شودoverride کرد و به آن Method Hiding می گویند. یعنی مخفی کردن متد.
منبع

Output :

From parent static m1()
From child non-static(instance) m2()
------
قبلا گفتیم متد استاتیک را بدون ساخت شی میشه فراخواند یعنی کد زیر:
JavaScript:
 Parent.m1();
نتیجه اجرا:
From parent static m1()
یا کد زیر:
JavaScript:
 Child.m1();
نتیجه اجرا:
From child static m1()
در کد زیر هم رفرنس و هم آبجکت از کلاس فرزند گرفته شده:
JavaScript:
    Child obj3 = new Child();
    obj3.m1();
نتیجه اجرا:
From child static m1()
پس با این روش ساختن آبجکت از کلاس فرزند می بینیم که متد استاتیک m1 واقعا hide یعنی مخفی شده.
 
آخرین ویرایش:

saalek110

Well-Known Member
a10.png
کلمه super
Invoking overridden method from sub-class
JavaScript:
// A Java program to demonstrate that overridden 
// method can be called from sub-class

// Base Class
class Parent
{
    void show()
    {
        System.out.println("Parent's show()");
    }
}

// Inherited class
class Child extends Parent
{
    // This method overrides show() of Parent
    @Override
    void show()
    {
        super.show();
        System.out.println("Child's show()");
    }
}

// Driver class
class Main
{
    public static void main(String[] args)
    {
        Parent obj = new Child();
        obj.show();
    }
}
Output:

Parent's show()
Child's show()
منبع
شرح برنامه : کلاس فرزند با استفاده از کلمه super آمده متد کلاس پدر را اجرا کرده.
 

saalek110

Well-Known Member
a10.png
عکس زیر از پستهای اول تاپیک است:
a1.png
حالا با کلمه override که در عکس بالا مشاهده می شود بیشتر آشنایی دارید.
همچنین با کلمه super آشنا شدید.
همچنین طرز ساختن شی از کلاس را یاد گرفتید و سپس صدا زدن متدهای پابلیک کلاس.
و طرز صدا زدن توابع استاتیک را یاد گرفید.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا