Bài viết Tính đa hình (Polymorphism) trong
Java – GP Coder (Lập trình Java) thuộc chủ đề về Giải Đáp thời
gian này đang được rất nhiều bạn quan tâm đúng không nào !! Hôm
nay, Hãy cùng Hàng Nhật
Cao Cấp tìm hiểu Tính đa hình (Polymorphism) trong Java – GP
Coder (Lập trình Java) trong bài viết hôm nay nhé ! Các bạn đang
xem bài viết : “Tính đa hình (Polymorphism) trong
Java – GP Coder (Lập trình Java)”
Thông tin chi tiết về Tính đa hình (Polymorphism) trong Java – GP Coder (Lập trình Java)
Xem nhanh
Tính đa hình (đa hình) là một trong bốn tính chất cơ bản của lập trình hướng đối tượng trong Java.
Tính đa hình là khả năng một đối tượng có thể thực hiện một tác vụ theo nhiều cách khác nhau.
Đối với tính chất này, nó có thể được xác định rõ nhất thông qua công việc gọi phương thức của đối tượng. Các phương thức hoàn toàn có thể giống nhau, nhưng công việc xử lý luồng có thể khác nhau. Nói cách khác: Tính đa hình cung cấp khả năng cho phép người thiết lập trình gọi trước một phương thức của đối tượng, tuy nhiên đối tượng chưa xác định có phương thức muốn gọi hay không. Đến khi thực thi (thời gian chạy), chương trình mới xác định đối tượng được xác định và gọi phương thức tương ứng của đối tượng đó. Kết nối đúng giúp chương trình được chuyển đổi nhẹ nhàng hơn, chỉ yêu cầu đối tượng cung cấp đúng phương thức cần thiết là đủ.
Trong Java, chúng ta sử dụng nạp chồng phương thức (method overloading) và ghi đè phương thức (method overriding) để có tính đa hình.
- Nạp chồng (Overloading): Đây là khả năng cho phép một lớp có nhiều thuộc tính, phương thức cùng tên nhưng với các tham số khác nhau về loại cũng như về số lượng. Khi được gọi, dựa vào tham số truyền vào, phương thức tương ứng sẽ được thực hiện.
- Ghi đè (Overriding): là hai phương thức cùng tên, cùng tham số, cùng kiểu trả về nhưng thằng con viết lại và dùng theo cách của nó, và xuất hiện ở lớp cha và tiếp tục xuất hiện ở lớp con. Khi dùng override, lúc thực thi, nếu lớp Con không có phương thức riêng, phương thức của lớp Cha sẽ được gọi, ngược lại nếu có, phương thức của lớp Con được gọi.
Nội dung
- 1 Đa hình lúc runtime trong java
- 1.1 Upcasting là gì?
- 1.2 Ví dụ về đa hình tại runtime trong Java
- 2 Đa hình tại runtime trong Java với thành viên dữ liệu
- 3 Đa hình lúc runtime trong Java với kế thừa nhiều tầng
- 4 Nạp chồng phương thức (method overloading)
- 4.1 Nạp chồng phương thức: thay đổi số lượng các tham số
- 4.2 Nạp chồng phương thức: thay đổi kiểu dữ liệu của các tham số
- 4.3 Một số câu hỏi về nạp chồng phương thức trong java
- 4.4 Nạp chồng phương thức và tự động ép kiểu
- 5 Ghi đè phương thức (method overriding)
- 5.1 Ví dụ về ghi đè phương thức (method overriding)
- 5.2 Một số câu hỏi về ghi đè phương thức (method overriding) trong java
- 6 Sự khác nhau giữa overloading và overriding trong java
Đa hình lúc runtime trong java
Đa hình lúc runtime là quá trình gọi phương thức đã được ghi đè trong thời gian thực thi chương trình. Trong quá trình này, một phương thức được ghi đè được gọi thông qua biến tham chiếu của một lớp cha.
Trước khi tìm hiểu về đa hình tại runtime, chúng ta cùng tìm hiểu về Upcasting.
[Hướng đối tượng C++] Đa hình là gì ?(Phần 1) – Phương thức ảo
Mô tả video
– Source code: http://123link.pw/7Nrv
✅ Mọi người cũng xem : có nên mua xe ô tô cũ
Upcasting là gì?
Khi biến tham chiếu của lớp cha tham chiếu tới đối tượng của lớp con, thì đó là Upcasting. Ví dụ:
class A class B extends A
A a = new B(); // upcasting
Các bạn xem thêm ở bài viết Cơ chế Upcasting và Downcasting trong java để hiểu rõ hơn.
Ví dụ về đa hình tại runtime trong Java
Ví dụ 1: chúng ta tạo hai lớp Bike và Splendar. Lớp Splendar kế thừa lớp Bike và ghi đè phương thức run() của nó. Chúng ta gọi phương thức run bởi biến tham chiếu của lớp cha. Khi nó tham chiếu tới đối tượng của lớp con và phương thức lớp con ghi đè phương thức của lớp cha, phương thức lớp con được triệu hồi tại runtime.
Khi việc gọi phương thức được quyết định bởi JVM chứ không phải Compiler, vì thế đó là đa hình tại runtime.
public class Bike public void run() System.out.println("running"); public class Splender extends Bike public void run() System.out.println("running safely with 60km"); public static void main(String args[]) Bike b = new Splender(); // upcasting b.run();
Kết quả:
running safely with 60km
Ví dụ 2: Giả sử Bank là một lớp cung cấp phương thức để lấy lãi suất. Nhưng lãi suất lại khác nhau giữa từng ngân hàng. Ví dụ, các ngân hàng VCB, AGR và CTG có thể cung cấp các lãi suất lần lượt là 8%, 7% và 9%. (Ví dụ này cũng có trong chương ghi đè phương thức nhưng không có Upcasting).
class Bank int getRateOfInterest() return 0; class VCB extends Bank int getRateOfInterest() return 8; class AGR extends Bank int getRateOfInterest() return 7; class CTG extends Bank int getRateOfInterest() return 9; class Test3 public static void main(String args[]) Bank b1 = new VCB(); // upcasting Bank b2 = new AGR(); // upcasting Bank b3 = new CTG(); // upcasting System.out.println("VCB lai suat la: " + b1.getRateOfInterest()); System.out.println("AGR lai suat la: " + b2.getRateOfInterest()); System.out.println("CTG lai suat la: " + b3.getRateOfInterest());
Kết quả:
VCB lai suat la: 8 VCB lai suat la: 7 VCB lai suat la: 9
Ví dụ 3: Shape
class Shape void draw() System.out.println("drawing..."); class Rectangle extends Shape void draw() System.out.println("drawing rectangle..."); class Circle extends Shape void draw() System.out.println("drawing circle..."); class Triangle extends Shape void draw() System.out.println("drawing triangle..."); class TestPolymorphism2 public static void main(String args[]) Shape s; s = new Rectangle(); s.draw(); s = new Circle(); s.draw(); s = new Triangle(); s.draw();
Kết quả:
drawing rectangle... drawing circle... drawing triangle...
[Khóa học lập trình hướng đối tượng C#] – Bài 6: Đa hình | HowKteam
Mô tả video
[Khóa học lập trình hướng đối tượng C#] – Bài 6: Đa hình | HowKteamnnNếu các bạn thấy hay thì hãy đăng ký theo dõi kênh, like, share cho mọi người cùng tham gia nhé.nnMuốn ủng hộ mình các bạn có thể nhấn vào quảng cáo hiện lên và load xong để mình được ít tiền duy trì nhé.nCảm ơn mọi người.nnHọc thêm kiến thức hoặc tải tài liệu tại https://www.howkteam.com/nLuyện tập trắc nghiệm mỗi ngày tại https://kquiz.vn/nnBài trước:n[Khóa học lập trình hướng đối tượng C#] – Bài 5: Kế thừa | HowKteamnhttps://www.youtube.com/watch?v=tgxT3xRdfvUu0026list=PL33lvabfss1zRgaWBcC__Bnt5AOSRfU71u0026index=5nnBài sau:n[Khóa học lập trình hướng đối tượng C#] – Bài 7: Interface | HowKteam nhttps://www.youtube.com/watch?v=nKNE6EFCaswu0026index=7u0026list=PL33lvabfss1zRgaWBcC__Bnt5AOSRfU71nnTập hợp khóa học lập trình cơ bản đến nâng cao.nTham gia group để cập nhật thêm thông tin cũng như tham gia khóa học online miễn phí. nnGroup FB: https://goo.gl/8T2krInWebsite: http://www.howkteam.com/nnDanh sách phát: https://goo.gl/0LIji0nnC++:nLập trình C++: https://goo.gl/8RCMtenBài toán kinh điển C++: https://goo.gl/7CszwZnnC#:nLập trình C#: https://goo.gl/AhxyAInLập trình C# WinForms: https://goo.gl/dPbSm4nLập trình ASP.NET MVC: https://goo.gl/riqrzPnnJava:nLập trình Java: https://goo.gl/VoDbbsnLập trình Android: https://goo.gl/LyV3ZXnnGame:nLập trình Unity 3D: https://goo.gl/RcBi6cnnOffice:nOffice Word 2016: https://goo.gl/GQUk5EnOffice Excel 2016: https://goo.gl/N3qdKsnOffice Power Point 2016: https://goo.gl/zegyVxnnProducts:nGame Caro C# Winforms: https://goo.gl/bMuXECnGame Flappy Bird Unity 3D: https://goo.gl/K00l5ynGame bắn Zombies Unity 3D: https://goo.gl/HUjWltnGame Doge Unity 3D: https://goo.gl/0pysFunApp lập lịch C# Winforms: https://goo.gl/xO0iX3nApp từ điển nói C# Winforms: https://goo.gl/KgHNNnnApp quản lý quán Cafe C# Winforms: https://goo.gl/FLZDDMnApp key logger C# Winforms: https://goo.gl/qV93CVnnStream:nKỹ thuật: https://goo.gl/tGtmwqnKinh nghiệm: https://goo.gl/VsQjkcnnÂm thanh:nTwo Step From Hell Colors Of Loven http://fbl.me/TJBn https://www.facebook.com/Thomas-Bergersen-147900228587129/n https://www.facebook.com/fourformusicn http://www.thomasbergersen.com/
Đa hình tại runtime trong Java với thành viên dữ liệu
Phương thức bị ghi đè không là thành viên dữ liệu, vì thế đa hình tại runtime không thể có được bởi thành viên dữ liệu. Trong ví dụ sau đây, cả hai lớp có một thành viên dữ liệu là speedlimit, chúng ta truy cập thành viên dữ liệu bởi biến tham chiếu của lớp cha mà tham chiếu tới đối tượng lớp con. Khi chúng ta truy cập thành viên dữ liệu mà không bị ghi đè, thì nó sẽ luôn luôn truy cập thành viên dữ liệu của lớp cha.
Qui tắc: Đa hình tại runtime không thể có được bởi thành viên dữ liệu.
Ví dụ:
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
Kết quả:
90
✅ Mọi người cũng xem : headless cms là gì
Đa hình lúc runtime trong Java với kế thừa nhiều tầng
Ví dụ 1:
class Animal void eat() System.out.println("eating"); class Dog extends Animal void eat() System.out.println("eating fruits"); class BabyDog extends Dog void eat() System.out.println("drinking milk"); public static void main(String args[]) Animal a1, a2, a3; a1 = new Animal(); a2 = new Dog(); a3 = new BabyDog(); a1.eat(); a2.eat(); a3.eat();
Kết quả:
eating eating fruits drinking Milk
Ví dụ 2:
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();
Kết quả:
Dog is eating
Vì BabyDog1 không ghi đè phương thức eat(), nên phương thức eat() của lớp Dog được gọi.
Nạp chồng phương thức (method overloading)
Nếu một lớp có nhiều phương thức cùng tên nhưng khác nhau về kiểu dữ liệu hoặc số lượng các tham số, thì đó là nạp chồng phương thức (Method Overloading).
Sử dụng nạp chồng phương thức giúp tăng khả năng đọc hiểu chương trình.
Nạp chồng phương thức được sử dụng để thu được tính đa hình lúc biên dịch (compile).
Có 2 cách nạp chồng phương thức trong java
- Thay đổi số lượng các tham số
- Thay đổi kiểu dữ liệu của các tham số
✅ Mọi người cũng xem : quần ngắn tiếng anh là gì
Nạp chồng phương thức: thay đổi số lượng các tham số
Ví dụ: tạo 2 phương thức có cùng kiểu dữ liệu: phương thức add() đầu tiên thực hiện việc tính tổng của 2 số, phương thức thứ hai thực hiện việc tính tổng của 3 số.
class Adder static int add(int a, int b) return a + b; static int add(int a, int b, int c) return a + b + c; class TestOverloading1 public static void main(String[] args) System.out.println(Adder.add(5, 5)); System.out.println(Adder.add(5, 5, 5));
Kết quả chạy chương trình trên:
10 15
Nạp chồng phương thức: thay đổi kiểu dữ liệu của các tham số
Ví dụ: tạo 2 phương thức có kiểu dữ liệu khác nhau: phương thức add() đầu tiên nhận 2 đối số có kiểu giá trị là integer, phương thức thứ hai nhận 2 đối số có kiểu giá trị là double.
class Adder static int add(int a, int b) return a + b;
static double add(double a, double b) return a + b;
class TestOverloading2 public static void main(String[] args) System.out.println(Adder.add(5, 5));System.out.println(Adder.add(4.3, 5.6));
Kết quả chạy chương trình trên:
10 9.9
✅ Mọi người cũng xem : cây baton là gì
Một số câu hỏi về nạp chồng phương thức trong java
Tại sao không thể nạp chồng phương thức bằng cách chỉ thay đổi kiểu trả về của phương thức?
Trong java, không thể nạp chồng phương thức bằng cách chỉ thay đổi kiểu trả về của phương thức bởi vì không biết phương thức nào sẽ được gọi.
Ví dụ:
class Adder static int add(int a, int b) return a + b; static double add(int a, int b) return a + b; class TestOverloading3 public static void main(String[] args) System.out.println(Adder.add(11, 11)); // Không biết gọi phương thức nào
Có thể nạp chồng phương thức main() không?
Có, bạn có thể nạp chồng n phương thức main. Nhưng JVM chỉ gọi phương thức main() có tham số truyền vào là một mảng String.
Ví dụ:
public class TestOverloading4 public static void main(String[] args) System.out.println("main with String[]"); public static void main(String args) System.out.println("main with String"); public static void main() System.out.println("main without args");
Kết quả khi chạy chương trình trên:
main with String[]
Nạp chồng phương thức và tự động ép kiểu
Kiểu dữ liệu của đối số truyền vào được thay đổi sang kiểu dữ liệu khác (tự động ép kiểu) nếu giá trị của đối số đó không phù hợp với kiểu dữ liệu của tham số đã được đinh nghĩa.
Để hiểu khái niệm này hãy xem ảnh sau:
Kiểu byte có thể được ép sang các kiểu short, int, long, float hoặc double. Kiểu dữ liệu short có thể được ép sang các kiểu int, long, float hoặc double. Kiểu dữ liệu char có thể được ép sang các kiểu int, long, float or double…
Ví dụ:
class OverloadingCalculation1 void sum(int a, long b) System.out.println(a + b); void sum(int a, int b, int c) System.out.println(a + b + c); public static void main(String args[]) OverloadingCalculation1 obj = new OverloadingCalculation1(); obj.sum(20, 20);// now second int literal will be promoted to long obj.sum(20, 20, 20);
Kết quả khi chạy chương trình trên:
40 60
Ví dụ: nếu không có kiểu đối số nào phù hợp, chuyển đổi kiểu sẽ không được thực hiện.
class OverloadingCalculation2 void sum(int a, int b) System.out.println("int arg method invoked"); void sum(long a, long b) System.out.println("long arg method invoked"); public static void main(String args[]) OverloadingCalculation2 obj = new OverloadingCalculation2(); obj.sum(20, 20);// now int arg sum() method gets invoked
Kết quả khi chạy chương trình trên:
int arg method invoked
Ví dụ: không có kiểu đối số nào phụ hợp trong phương thức và mỗi phương thức thay đổi số đối số tương tự nhau. Trường hợp này sẽ không xác định được phương thức nào được gọi.
public class OverloadingCalculation3 void sum(int a, long b) System.out.println("a method invoked"); void sum(long a, int b) System.out.println("b method invoked"); public static void main(String args[]) OverloadingCalculation3 obj = new OverloadingCalculation3(); obj.sum(20, 20); // không xác định được phương thức nào được gọi
✅ Mọi người cũng xem : hoạt náo viên là gì
Ghi đè phương thức (method overriding)
Ghi đè phương thức trong java xảy ra nếu lớp con có phương thức giống lớp cha.
Nói cách khác, nếu lớp con cung cấp sự cài đặt cụ thể cho phương thức đã được cung cấp bởi một lớp cha của nó được gọi là ghi đè phương thức (method overriding) trong java.
Ghi đè phương thức được sử dụng để thu được tính đa hình tại runtime.
Nguyên tắc ghi đè phương thức:
- Phương thức phải có tên giống với lớp cha.
- Phương thức phải có tham số giống với lớp cha.
- Lớp con và lớp cha có mối quan hệ kế thừa.
✅ Mọi người cũng xem : glp 1 là gì
Ví dụ về ghi đè phương thức (method overriding)
Ví dụ 1: chúng ta định nghĩa phương thức run() trong lớp con giống như đã được định nghĩa trong lớp cha, nhưng được cài đặt rõ ràng trong lớp con. Tên và tham số của phương thức là giống nhau, 2 lớp cha và con có quan hệ kế thừa.
class Vehicle void run() System.out.println("Vehicle is running"); class Bike extends Vehicle void run() System.out.println("Bike is running safely"); public static void main(String args[]) Bike obj = new Bike(); obj.run();
Kết quả khi chạy chương trình trên:
Bike is running safely
Ví dụ 2: Giả sử Bank là một đối tượng cung cấp lãi suất. Nhưng lãi suất lại khác nhau giữa từng ngân hàng. Ví dụ, các ngân hàng VCB, AGR và CTG có thể cung cấp các lãi suất lần lượt là 8%, 7% và 9%.
class Bank int getRateOfInterest() return 0; class VCB extends Bank int getRateOfInterest() return 8; class AGR extends Bank int getRateOfInterest() return 7; class CTG extends Bank int getRateOfInterest() return 9; class BankApp public static void main(String args[]) VCB s = new VCB(); AGR i = new AGR(); CTG a = new CTG(); System.out.println("VCB Rate of Interest: " + s.getRateOfInterest()); System.out.println("AGR Rate of Interest: " + i.getRateOfInterest()); System.out.println("CTG Rate of Interest: " + a.getRateOfInterest());
Kết quả khi chạy chương trình trên:
VCB Rate of Interest: 8 AGR Rate of Interest: 7 CTG Rate of Interest: 9
Một số câu hỏi về ghi đè phương thức (method overriding) trong java
Có ghi đè được phương thức static không?
Không, phương thức static không thể ghi đè được, bởi vì ghi đè phương thức được thực thi lúc runtime (tính đa hình).
Tại sao không ghi đè được phương thức static?
Vì phương thức static được ràng buộc với class, còn phương thức instance được ràng buộc với đối tượng. Static thuộc về vùng nhớ class còn instance thuộc về vùng nhớ heap.
Có ghi đè phương thức main được không?
Không, vì main là phương thức static.
✅ Mọi người cũng xem : bật sắt là gì
Sự khác nhau giữa overloading và overriding trong java
Nạp chồng phương thức | Ghi đè phương thức |
Nạp chồng phương thức được sử dụng để tăng tính có thể đọc của chương trình | Ghi đè phương thức được sử dụng để cung cấp trình triển khai cụ thể của phương thức mà đã được cung cấp bởi lớp cha của nó |
Nạp chồng phương thức được thực hiện bên trong lớp (class) | Ghi đè phương thức xuất hiện trong hai lớp mà có mối quan hệ IS-A (kế thừa) |
Trong Nạp chồng phương thức, tham số phải khác nhau | Trong Ghi đè phương thức, tham số phải là giống nhau |
Nạp chồng phương thức là ví dụ của đa hình tại biên dịch (compile) | Ghi đè phương thức là ví dụ của đa hình tại thực thi (runtime) |
Trong Java, Nạp chồng phương thức không thể được thực hiện bởi thay đổi kiểu trả về của phương thức. Kiểu trả về có thể là giống hoặc khác trong Nạp chồng phương thức. Nhưng bạn phải thay đổi tham số | Kiểu trả về phải là giống. |
Tài liệu tham khảo:
- http://vietjack.com/java/da_hinh_trong_java.jsp
- https://www.javatpoint.com/runtime-polymorphism-in-java
- http://vietjack.com/java/overloading_trong_java.jsp
- https://www.javatpoint.com/method-overloading-in-java
- http://vietjack.com/java/overriding_trong_java.jsp
- https://www.javatpoint.com/method-overriding-in-java
✅ Mọi người cũng xem : đoàn kết nghĩa là gì
Bình luận
bình luận
Các câu hỏi về tính đa hình là gì
Nếu có bắt kỳ câu hỏi thắc mắt nào vê tính đa hình là gì hãy cho chúng mình biết nhé, mõi thắt mắt hay góp ý của các bạn sẽ giúp mình cải thiện hơn trong các bài sau nhé <3 Bài viết tính đa hình là gì ! được mình và team xem xét cũng như tổng hợp từ nhiều nguồn. Nếu thấy bài viết tính đa hình là gì Cực hay ! Hay thì hãy ủng hộ team Like hoặc share. Nếu thấy bài viết tính đa hình là gì rât hay ! chưa hay, hoặc cần bổ sung. Bạn góp ý giúp mình nhé!!
Các Hình Ảnh Về tính đa hình là gì
Các hình ảnh về tính đa hình là gì đang được chúng mình Cập nhập. Nếu các bạn mong muốn đóng góp, Hãy gửi mail về hộp thư [email protected] Nếu có bất kỳ đóng góp hay liên hệ. Hãy Mail ngay cho tụi mình nhé
Tra cứu thêm thông tin về tính đa hình là gì tại WikiPedia
Bạn hãy xem nội dung về tính đa hình là gì từ web Wikipedia tiếng Việt.◄ Tham Gia Cộng Đồng Tại💝 Nguồn Tin tại: https://hangnhatcaocap.com.vn/
💝 Xem Thêm Chủ Đề Liên Quan tại : https://hangnhatcaocap.com.vn/wiki-hoi-dap/
Các bài viết liên quan đến
hay đó anh, vu nguyen đây :))