با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن. و کاربرانی که دوره کامل آموزش برنامه نویسی جاوا را دنبال می کنند. Polymorphism یکی از توانایی های آبجکت است که در بسیاری از اشکال قرار گیرد. شایع ترین استفاده از پلی مورفیسم در OOP زمانی اتفاق می افتد که یک مرجع کلاس پدر و مادر برای اشاره به یک شیء زیر کلاس استفاده می شود. هر شیء جاوا که می تواند بیش از یک تست IS-A را تصویب کند، در نظر گرفته می شود که چند مورفیسم است. در جاوا، تمام اشیاء جاوا پلی مورفیسم هستند، زیرا هر شیء تست IS-A را برای نوع خود و کلاس Object منتقل می کند. مهم است بدانیم که تنها راه ممکن برای دسترسی به یک شی از طریق یک متغیر مرجع است. برای آشنایی بیشتر با مباحث پلی مورفیسم در جاوا در ادامه ی مباحث این آموزش با ما همراه باشید.
در جاوا متغیر مرجع می تواند به هر شیء از هر نوع اعلام شده یا هر زیر نوع آن اعلام شود.
متغیر مرجع می تواند به عنوان یک نوع کلاس یا رابط اعلام شود.
مثال:
1 2 3 | public interface Vegetarian{} public class Animal{} public class Deer extends Animal implements Vegetarian{} |
در حال حاضر، کلاس Deer به عنوان پلی مورفیسم در نظر گرفته می شود، زیرا این یک وراثت است. در زیر نمونه های فوق درست است:
هنگامی که پارامتر مرجع را به مرجع شیء گوزن اعمال می کنیم، کدهای زیر صحیی هستند:
1 2 3 4 | Deer d = new Deer(); Animal a = d; Vegetarian v = d; Object o = d; |
تمام متغیرهای مرجع d، a، v، o به همان شیء Deer در گره اشاره دارند.
ما تاکنون در مورد متدoverridden بحث كرديم. در حالي كه زیر كلاس مي تواند يك متد را در کلاس والد خود برشمرد.
یک متد overridden در اصل در کلاس پدربزرگ پنهان شده است و فراخوانی نشده است.
متد overridden در صورتی فراخوانی می شود که کلاس child از کلمه کلیدیsuper در متد اصلی استفاده کند.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* File name : Employee.java */ public class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } } |
اکنون فرض کنید که کلاس Employee را به صورت زیر تعریف می کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System.out.println("Within mailCheck of Salary class "); System.out.println("Mailing check to " + getName() + " with salary " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } } |
در حال حاضر، برنامه زیر را با دقت مطالعه کنید و سعی کنید خروجی آن را حدس بزنید :
1 2 3 4 5 6 7 8 9 10 11 12 | /* File name : VirtualDemo.java */ public class VirtualDemo { public static void main(String [] args) { Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); System.out.println("Call mailCheck using Salary reference --"); s.mailCheck(); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } } |
نتیجه ی اجرای کد فوق در جاوا بصورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 | Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.0 |
در اینجا ما دو شیء را ایجاد می کنیم یکی با استفاده از یک مرجع Salary و دیگری با استفاده از مرجع Employee.
در هنگام فراخوانی () s.mailCheck ، کامپایلر () mailCheck را در کلاس کامپایل در کلاس Salary می بیند.
سپس کامپایلر () JVM mailCheck را در کلاس Salary در زمان اجرا، فراخوانی می کند.
وقتی کامپایلر () e.mailCheck را می بیند، در واقع کامپایلر متد () mailCheck را در کلاس Employee می بیند.
این رفتارها به عنوان فراخوانی متد مجازی شناخته می شوند. و چنین متدهایی را متد مجازی می نامند.
در این آموزش با چگونگی ارتباط و اشاره کلاس والد به فرزند با استفاده از مفهوم پلی مورفیسم در جاوا آشنا شدیم. در بخش بعدی شما را با مفاهیم انتزاع در جاوا آشنا خواهیم کرد.